Lines Matching refs:loop

37 随着 OpenHarmony 的逐步完善,我们计划在未来的版本中,逐步将应用模型中的事件循环归一,并增强 OpenHarmony 自身的事件循环,以解决许多双 loop 机制下的调度问题,并为开发者…
39 开发者应尽可能避免在 `napi_get_uv_event_loop` 接口(已在API12中标记废弃)获取的应用主 loop 上使用 libuv 的 ndk 进行操作,因为这可能会带来各种问题,并…
57 在native层直接通过调用`napi_get_uv_event_loop`接口获取系统loop,调用libuv NDK接口实现相关功能。
80 uv_loop_s *loop = nullptr;
82 napi_get_uv_event_loop(env, &loop);
84 int ret = uv_queue_work(loop, work, execute, complete);
128 uv_loop_t *loop;
190 uv_loop_t *loop;
206 napi_get_uv_event_loop(env, &loop);
212 uv_poll_init(loop, poll_handle, fd);
276 uv_loop_t *loop;
292 napi_get_uv_event_loop(env, &loop);
297 uv_poll_init(loop, poll_handle, fd);
301 uv_async_send(&loop->wq_async);
439 | [loop概念及相关接口](#libuv中的事件循环) | uv_loop_init |
440 | [loop概念及相关接口](#libuv中的事件循环) | uv_loop_close |
441 | [loop概念及相关接口](#libuv中的事件循环) | uv_default_loop |
442 | [loop概念及相关接口](#libuv中的事件循环) | uv_run |
443 | [loop概念及相关接口](#libuv中的事件循环) | uv_loop_alive |
444 | [loop概念及相关接口](#libuv中的事件循环) | uv_stop |
460 …armony中使用libuv时,**务必注意:使用`uv_loop_init`接口初始化loop的线程和调用`uv_run`的线程应保持一致,称为loop线程,并且对uvloop的所有非线程安全操…
464 根据loop来源的不同,可分为两种情况,即开发者创建loop和从env获取loop
466 ##### 开发者创建loop
468 …w`创建loop或者`uv_loop_init`接口初始化looploop的生命周期由开发者自行维护。在这种情况下,如前文所述,需要保证`uv_run`执行在与创建/初始化loop操作相同的线程…
470 如果因为业务需要,必须在其他线程往loop线程抛任务,请使用`uv_async_send`函数实现,即在async句柄初始化时,注册一个回调函数,当调用`uv_async_send`时,在主线程上执…
484 auto loop = handle->loop;
486 uv_timer_init(loop, timer);
501 std::thread t([](){ // A线程,loop线程
502 uv_loop_t* loop = new uv_lppo_t;
503 // 开发者自己创建loop,请注意维护loop的生命周期
504 uv_loop_init(loop);
506 uv_async_init(loop, async, timer_cb);
507 // 让loop开始运行
508 uv_run(loop, UV_RUN_DEFAULT);
511 loop,
519 while (uv_run(loop, UV_RUN_DEFAULT) != 0);
520 // 释放loop
521 uv_loop_delete(loop);
530 uv_async_send(async); // 调用uv_async_send,通知loop线程调用与async句柄绑定的timer_cb
562 上述代码只是一个简单的示例,进阶实现是:使用一个全局的任务队列,在非loop线程提交任务到任务队列,然后在合适的时机调用uv_async_send函数,回到loop线程执行async_cb,在asy…
564 ##### 从env获取loop
566 开发者使用`napi_get_uv_event_loop`接口从env获取到的loop一般是系统创建的js线程的事件循环,因此应当避免在子线程中调用非线程安全函数。
568 …在非loop线程上调用非线程安全函数,请使用线程安全函数`uv_async_send`函数进行操作。即定义一个uv_async_t*类型的句柄,初始化该句柄的时候,将需要在子线程调用的非线程安全函…
595 事件循环是libuv中最核心的一个概念,loop负责管理整个事件循环的所有资源,它贯穿于整个事件循环的生命周期。通常将`uv_run`所在的线程称为该事件循环的主线程。
599 `UV_RUN_DEFAULT`:默认轮询方式,该模式将会一直运行下去,直到loop中没有活跃的句柄和请求。
601 `UV_RUN_ONCE`:一次轮询模式,如果pending_queue中有回调函数,则执行,然后跳过`uv__io_poll`函数。此模式默认认为loop中一定有事件发生。
608 int uv_loop_init(uv_loop_t* loop);
611loop进行初始化。
614 int uv_loop_close(uv_loop_t* loop);
617 关闭loop,该函数只有在loop中所有的句柄和请求都关闭后才能成功返回,否则将返回UV_EBUSY。
620 int uv_loop_delete(uv_loop_t* loop);
623loop,该接口会先调用`uv_loop_close`,然后再将loop释放掉。在OpenHarmony平台上,由于assert函数不生效,因此不论`uv_loop_close`函数是否成功清理l…
629 …该函数创建一个进程级的loop。在OpenHarmony中,由于目前的应用主循环及其他js工作线程还存在着libuv的loop。因此我们不建议开发者使用该函数来创建loop并实现业务功能。在系统的…
632 int uv_run(uv_loop_t* loop, uv_run_mode mode);
638 int uv_loop_alive(uv_loop_t loop);
641 判断loop是否处于活跃状态。
644 void uv_stop(uv_loop_t* loop);
647 该函数用来停止一个事件循环,在loop的下一次迭代中才会停止。如果该函数发生在I/O操作之前,将不会阻塞而是直接跳过`uv__io_poll`。
649 **使用技巧**:在使用loop时,需要特别注意`uv_stop`函数的使用。开发者需要确保`uv_stop`前,通知与loop相关的所有线程的handle都关闭。参考代码如下:
652 int stop_loop(uv_loop_t* loop)
654 uv_stop(loop);
663 uv_walk(loop, ensure_close, nullptr);
665 // 继续运行uv_run,直到loop中不存在活跃的句柄和请求为止。
667 if (uv_run(loop, UV_RUN_DEFAULT) == 0) {
672 // 最后检查loop状态。
673 if (uv_loop_alive(loop) != 0) {
682 handle表示一个持久性的对象,通常挂载到loop中对应的handle_queue队列上。如果handle处于活跃状态,每次`uv_run`都会处理handle中的回调函数。
703 对于libuv中的handles,对其有个正确的认识并管理好它的生命周期至关重要。handle作为一个长期存在于loop中的句柄,在使用中,开发者应遵循下面的原则:
707 3. 句柄在确定后续不再使用后,调用`uv_close`将句柄从loop中摘除。
718 `uv_close`调用后,它首先将要关闭的handle挂载到loop中的closing_handles队列上,然后等待loop所在线程运行`uv__run_closing_handles`函数。最…
726 > 2. 所有的handle操作都不能通过获取其他线程loop的方式,在非loop线程上调用。
730 对于libuv中的requests,开发者需要确保在进行异步任务提交时,**通过动态申请的request,要在loop所在线程执行的complete回调函数中释放**。用uv_work_t举例,代码…
734 uv_queue_work(loop, work, [](uv_work_t* req) {
746 uv_queue_work(loop, work, [](uv_work_t* work) {
751 uv_queue_work(loop, work, [](...) {/* do something*/}, [](...) {
763 …RT调度执行该任务,并将`after_work_cb`抛到eventhandler的event queue中,等待eventhandler调度并回到loop线程执行。需要注意的是,`uv_queu…
769 `uv_queue_work`仅限于在loop线程中调用,这样不会有多线程安全问题。**请不要把uv_queue_work作为线程间通信的手段,即A线程获取到B线程的loop,并通过`uv_queu…
775 …art`、`uv_timer_stop`和`uv_timer_again`)同时操作同一个loop的timer heap,否则将导致崩溃,如果想要使用libuv的接口操作定时器,请**保持在与当前…
780 以下错误示例中,由于在多个线程操作同一个loop的timer heap,崩溃率极高。
828 uv_loop_t* loop = nullptr;
831 napi_get_uv_event_loop(env, &loop);
832 uv_timer_init(loop, timer);
833 std::thread t1([&loop, &timer](){
880 uv_loop_t* loop = nullptr;
883 napi_get_uv_event_loop(env, &loop);
884 uv_timer_init(loop, timer);
946 auto loop = handle->loop;
948 uv_timer_init(loop, timer);
957 uv_loop_t* loop = nullptr;
958 napi_get_uv_event_loop(env, &loop);
959 uv_async_init(loop, async, timer_cb);
1004 int uv_async_init(uv_loop_t* loop, uv_async_t* handle, uv_async_cb async_cb)
1007 loop:事件循环loop
1036 uv_loop_t* loop = nullptr;
1053 loop = uv_default_loop();
1055 uv_async_init(loop, async, async_handler);
1064 return uv_run(loop, UV_RUN_DEFAULT);
1105 int uv_queue_work(uv_loop_t* loop,
1113 after_work_cb:loop所在线程的要执行的回调函数。
1115 **注意:** work_cb与after_work_cb的执行有一个时序问题,只有work_cb执行完,通过`uv_async_send(loop->wq_async)`触发fd事件,loop所在…
1123 …务。在主线程中,eventhandler通过fd驱动的方式来触发任务的执行,eventhandler监听了uv_loop中的backend_fd。当loop中有fd事件触发的时候,eventhan…
1141 * @param loop 事件循环
1150 int uv_random(uv_loop_t* loop,
1169 * @param loop 事件循环
1176 int uv_queue_work(uv_loop_t* loop,
1190 * @param loop 事件循环
1199 int uv_fs_read(uv_loop_t* loop, uv_fs_t* req,
1209 * @param loop 事件循环
1218 int uv_fs_open(uv_loop_t* loop,
1228 * @param loop 事件循环
1238 int uv_fs_sendfile(uv_loop_t* loop,
1249 * @param loop 事件循环
1259 int uv_fs_write(uv_loop_t* loop,
1270 * @param loop 事件循环
1279 int uv_fs_copyfile(uv_loop_t* loop,
1295 * @param loop 事件循环
1304 int uv_getaddrinfo(uv_loop_t* loop,
1320 * @param loop 事件循环
1328 int uv_getnameinfo(uv_loop_t* loop,