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);
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
但是最近查看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);
}
}
- 1.
- 2.
- 3.
- 4.
- 5.
- 6.
- 7.
- 8.
- 9.
- 10.
- 11.
- 12.
- 13.
- 14.
- 15.
- 16.
- 17.
- 18.
- 19.
- 20.
- 21.
- 22.
- 23.
- 24.
- 25.
- 26.
问题:
- 想确认上述uv_async_send的规避方案是否可商用? uv_poll_init是否可以使用?
- 上述华为移植flutter项目中使用的方案是否是最终推荐的方案?方案是否有问题?
HarmonyOS
赞
收藏 0
回答 1
相关问题
HarmonyOS ArkTS不允许any了
832浏览 • 1回复 待解决
ArkTSCheck检查不允许使用any
1824浏览 • 1回复 待解决
HarmonyOS API12是否有json解析工具
957浏览 • 1回复 待解决
HarmonyOS HarmonyOSapp不允许使用2个UIAbility吗?
560浏览 • 1回复 待解决
HarmonyOS Sendable的class不允许属性使用其它的装饰器
599浏览 • 1回复 待解决
HarmonyOS 请问@Extended装饰器为什么不允许export
947浏览 • 1回复 待解决
首次启动弹出欢迎页,在用户点击同意之前,不允许拉起多个Ability实例,只有点击同意之后才允许拉起。
1230浏览 • 1回复 待解决
HarmonyOS API12中是否存在获取手机相册图片后缀的API
936浏览 • 1回复 待解决
HarmonyOSfs.openSync 系统相册返回的照片资源 返回 13900001 操作不允许
694浏览 • 1回复 待解决
应用涉及地理位置的持续上报,HarmonyOS系统是否支持,会不会把杀掉,不允许持续上报?
988浏览 • 1回复 待解决
HarmonyOS 涉及到RN框架,是否使用API12较为合理
853浏览 • 1回复 待解决
Redis 缓存中的“RedisValue”值参数中不允许使用哪些字符?
2945浏览 • 1回复 待解决
Api12 arm模拟器无法启动
1120浏览 • 1回复 待解决
#鸿蒙通关秘籍#不允许将属性分配给“@ObjectLink”修饰的属性
806浏览 • 0回复 待解决
HarmonyOS 进入web页面后期望拼比剪切板弹窗,不允许copy
793浏览 • 1回复 待解决
HarmonyOS CustomDialog在api12上背景无法透明
859浏览 • 1回复 待解决
HarmonyOS 针对API12:组件使用场景dialog
1073浏览 • 1回复 待解决
HarmonyOS 自定义弹窗 @CustomDialog 想要实现屏蔽物理返回,不允许用物理返回按钮关闭弹窗
866浏览 • 1回复 待解决
HarmonyOS emitter.EventData的data在升级API12之后不支持class的实例了吗
750浏览 • 1回复 待解决
HarmonyOS API12如何获取设备内网ip地址信息
1697浏览 • 1回复 待解决
HarmonyOS 升级API12后,使用ObjectLink遇到编译警告
905浏览 • 1回复 待解决
ts 后面会不会不允许使用,ts 和 ets 建议的使用边界
2478浏览 • 1回复 待解决
#鸿蒙通关秘籍# 为什么在鸿蒙共享模块内不允许使用side-effects-import?
654浏览 • 0回复 待解决
HarmonyOS libEGL.so库在 API12 上不见了
1388浏览 • 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