HarmonyOS API12之后是否不允许uv_poll

发现在API 12上使用uv_poll_init在主线程监听timefd(自己实现的message loop),碰到了无法抛任务到主线程的问题,华为侧给的解法是增加uv_async_send的方式规避:

// for platform thread
is_platform_loop_ = true;
running_ = true;
auto* loop = reinterpret_cast<uv_loop_t*>(platform_loop);
uv_poll_init(loop, &poll_handle_, timer_fd_.get());
// 系统抛异步任务是会在ffrt线程中执行一次uv_async_send触发一次fd事件。
// 由于双loop的弊端,现在ffrt执行完任务以后,会将主线程的回调提交给eventhandler,不再执行uv_async_send。
// 因此不再触发fd事件,uv_poll_start接口就不会生效。
uv_async_send(&loop->wq_async);

但是最近查看flutter移植项目(也是华为自己的项目)发现其中将uv_poll_init的方式改为了uv_async_init,并通过注释说明api12不允许使用uv_poll,如下所示:

MessageLoopOhos::MessageLoopOhos(void* platform_loop)
    : epoll_fd_(FML_HANDLE_EINTR(::epoll_create(1 /* unused */))),
      timer_fd_(::timerfd_create(kClockType, TFD_NONBLOCK | TFD_CLOEXEC)),
      running_(false),
      isPlatformLoop(false) {
  FML_CHECK(epoll_fd_.is_valid());
  FML_CHECK(timer_fd_.is_valid());
  bool added_source = AddOrRemoveTimerSource(true);
  FML_CHECK(added_source);
  async_handle_.data = this;
  if (platform_loop != nullptr) {
    isPlatformLoop = true;
    uv_loop_t* loop = reinterpret_cast<uv_loop_t*>(platform_loop);
    uv_async_init(loop, &async_handle_,
                  OnAsyncCallback);  // ohos after API12 not allow use uv_poll
    timerhandleThread = std::thread([this]() {
      running_ = true;
      TimerFdWatcher();
    });
  } else {
    uv_loop_init(&loop_);
    uv_poll_init(&loop_, &poll_handle_, timer_fd_.get());
    poll_handle_.data = this;
    uv_poll_start(&poll_handle_, UV_READABLE, OnPollCallback);
  }
}

问题:

  • 想确认上述uv_async_send的规避方案是否可商用? uv_poll_init是否可以使用?
  • 上述华为移植flutter项目中使用的方案是否是最终推荐的方案?方案是否有问题?
HarmonyOS
1天前
浏览
收藏 0
回答 1
待解决
回答 1
按赞同
/
按时间
zbw_apple

由于当前系统中的应用主循环不是通过UV_RUN_DEFAULT的方式执行的,而是由eventhandler监听了uvloop的fd来驱动执行一次uv_run。在应用主线程上调用uv接口无法像正常使用uv接口一样使其生效。

uv_poll_start这个函数本身是通过将应用方创建的fd通过epoll_ctl加入到uvloop中的epoll_fd中去,且注意执行时机是在下一次迭代中,也就是下一次uv_run中。因此需要额外触发一次uv_async_send使uv_poll_start生效。

采用第一种方案,额外开销小,且后续底层的改造对方案一的影响较小(仅需删除一行代码即可),因此推荐使用第一种方法。

后续可关注此文档:https://gitee.com/openharmony/docs/blob/master/zh-cn/application-dev/reference/native-lib/libuv.md

分享
微博
QQ
微信
回复
1天前
相关问题
HarmonyOS ArkTS不允许any了
41浏览 • 1回复 待解决
ArkTSCheck检查不允许使用any
55浏览 • 1回复 待解决
HarmonyOS API12是否有json解析工具
51浏览 • 1回复 待解决
HarmonyOS 针对API12:组件使用场景dialog
105浏览 • 1回复 待解决
Api12 arm模拟器无法启动
394浏览 • 1回复 待解决
HarmonyOS libEGL.so库在 API12 上不见了
526浏览 • 1回复 待解决