libuv 句柄解读-检查(check)
check handle 可以被译为检查句柄,如果程序中启动了 check handle 后,在事件循环中,每当 I/O 循环退出阻塞的时候都会被执行一遍,它与 prepare 刚好是相互呼应的,prepare 是在 I/O 循环进入阻塞前,check 是在 I/O 循环退出阻塞后被调用。
解读
check handle可以被译为检查句柄,如果程序中启动了check handle后,在事件循环中,每当 I/O 循环退出阻塞的时候都会被执行一遍,它与 prepare 刚好是相互呼应的,prepare 是在 I/O 循环进入阻塞前,check 是在 I/O 循环退出阻塞后被调用。
这种设计机制应该是 libuv 留个用户的接口,在退出 I/O 循环的阻塞状态后执行用户自定义的校验操作。
回顾一下 libuv 的事件循环过程,它有一个uv__run_check()函数会被执行,就是在事件循环迭代的过程中处理 check handle。
数据类型
uv_check_t 是 check handle 的数据类型,通过它可以定义一个 check handle 的实例。
typedef struct uv_check_s uv_check_t;
check handle的回调函数
typedef void (*uv_check_cb)(uv_check_t* handle);
如果 check handle 的实例想要执行回调函数,则需要传递一个uv_check_cb类型的回调函数到uv_check_start()函数中。
API
- 初始化句柄。
int uv_check_init(uv_loop_t* loop, uv_check_t* check)
- 以给定的回调函数开始句柄。
int uv_check_start(uv_check_t* check, uv_check_cb cb)
- 停止句柄,回调函数将不会再被调用。
int uv_check_stop(uv_check_t* check)
样例解读
说了那么多,首先方个 check handle 的例子吧,通过例子去讲解 check handle 相关的知识。
#include <stdio.h>
#include <stdlib.h>
#include <uv.h>
int64_t num = 0;
void my_idle_cb(uv_idle_t* handle)
{
num++;
printf("idle callback\n");
if (num >= 5) {
printf("idle stop, num = %ld\n", num);
uv_stop(uv_default_loop());
}
}
void my_check_cb(uv_check_t *handle)
{
printf("check callback\n");
}
int main()
{
uv_idle_t idler;
uv_check_t check;
uv_idle_init(uv_default_loop(), &idler);
uv_idle_start(&idler, my_idle_cb);
uv_check_init(uv_default_loop(), &check);
uv_check_start(&check, my_check_cb);
uv_run(uv_default_loop(), UV_RUN_DEFAULT);
return 0;
}
main函数的处理过程:
- 定义 idler 实例。
- 定义 check 实例。