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
赞
收藏 0
回答 1
待解决
相关问题
HarmonyOS ArkTS不允许any了
41浏览 • 1回复 待解决
ArkTSCheck检查不允许使用any
55浏览 • 1回复 待解决
HarmonyOS HarmonyOSapp不允许使用2个UIAbility吗?
72浏览 • 1回复 待解决
HarmonyOS API12是否有json解析工具
51浏览 • 1回复 待解决
HarmonyOS 请问@Extended装饰器为什么不允许export
37浏览 • 1回复 待解决
首次启动弹出欢迎页,在用户点击同意之前,不允许拉起多个Ability实例,只有点击同意之后才允许拉起。
745浏览 • 1回复 待解决
HarmonyOSfs.openSync 系统相册返回的照片资源 返回 13900001 操作不允许
90浏览 • 1回复 待解决
HarmonyOS API12中是否存在获取手机相册图片后缀的API
63浏览 • 1回复 待解决
应用涉及地理位置的持续上报,HarmonyOS系统是否支持,会不会把杀掉,不允许持续上报?
390浏览 • 1回复 待解决
HarmonyOS 涉及到RN框架,是否使用API12较为合理
33浏览 • 1回复 待解决
Redis 缓存中的“RedisValue”值参数中不允许使用哪些字符?
2234浏览 • 1回复 待解决
HarmonyOS 针对API12:组件使用场景dialog
105浏览 • 1回复 待解决
HarmonyOS CustomDialog在api12上背景无法透明
48浏览 • 1回复 待解决
#鸿蒙通关秘籍#不允许将属性分配给“@ObjectLink”修饰的属性
107浏览 • 0回复 待解决
Api12 arm模拟器无法启动
394浏览 • 1回复 待解决
HarmonyOS 进入web页面后期望拼比剪切板弹窗,不允许copy
31浏览 • 1回复 待解决
HarmonyOS emitter.EventData的data在升级API12之后不支持class的实例了吗
61浏览 • 1回复 待解决
HarmonyOS 升级API12后,使用ObjectLink遇到编译警告
90浏览 • 1回复 待解决
HarmonyOS API12如何获取设备内网ip地址信息
113浏览 • 1回复 待解决
HarmonyOS 自定义弹窗 @CustomDialog 想要实现屏蔽物理返回,不允许用物理返回按钮关闭弹窗
350浏览 • 1回复 待解决
ts 后面会不会不允许使用,ts 和 ets 建议的使用边界
1781浏览 • 1回复 待解决
#鸿蒙通关秘籍# 为什么在鸿蒙共享模块内不允许使用side-effects-import?
128浏览 • 0回复 待解决
HarmonyOS libEGL.so库在 API12 上不见了
526浏览 • 1回复 待解决
由于当前系统中的应用主循环不是通过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