如何分析libuv中的idle、check、prepare阶段
发表于:2025-02-04 作者:千家信息网编辑
千家信息网最后更新 2025年02月04日,这期内容当中小编将会给大家带来有关如何分析libuv中的idle、check、prepare阶段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。idle、check、
千家信息网最后更新 2025年02月04日如何分析libuv中的idle、check、prepare阶段
这期内容当中小编将会给大家带来有关如何分析libuv中的idle、check、prepare阶段,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。
idle、check、prepare是libuv事件循环中的三个阶段,这三个阶段主要是从各自的队列里拿出任务执行,有各自对应的数据结构。nodejs的setImmediate会使用这些阶段。
#include "uv.h"
#include "internal.h"
#define UV_LOOP_WATCHER_DEFINE(name, type)
int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) {
// 初始化handle的类型,所属loop,打上UV_HANDLE_REF,并且把handle插入loop->handle_queue队列的队尾
uv__handle_init(loop, (uv_handle_t*)handle, UV_##type);
handle->name##_cb = NULL;
return 0;
}
int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) {
// 如果已经执行过start函数则直接返回
if (uv__is_active(handle)) return 0;
if (cb == NULL) return UV_EINVAL;
// 把handle插入loop中相应类型的队列,loop有prepare,idle和check三个队列
QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue);
// 挂载回调,下一轮循环的时候被执行
handle->name##_cb = cb;
// 设置UV_HANDLE_ACTIVE标记位,并且loop中的handle数加一,init的时候只是把handle挂载到loop,start的时候handle才处于激活态
uv__handle_start(handle);
return 0;
}
int uv_##name##_stop(uv_##name##_t* handle) {
if (!uv__is_active(handle)) return 0;
// 把handle从loop中相应的队列移除,但是还挂载到handle_queue中
QUEUE_REMOVE(&handle->queue);
// 清除active标记位并且减去loop中handle的active数
uv__handle_stop(handle);
return 0;
}
// 在每一轮循环中执行该函数,执行时机见uv_run
void uv__run_##name(uv_loop_t* loop) {
uv_##name##_t* h;
QUEUE queue;
QUEUE* q;
// 把该类型对应的队列中所有节点摘下来挂载到queue变量
QUEUE_MOVE(&loop->name##_handles, &queue);
// 遍历队列,执行每个节点里面的函数
while (!QUEUE_EMPTY(&queue)) {
// 取下当前待处理的节点
q = QUEUE_HEAD(&queue);
// 取得该节点对应的整个结构体的基地址
h = QUEUE_DATA(q, uv_##name##_t, queue);
// 把该节点移出当前队列
QUEUE_REMOVE(q);
// 重新插入原来的队列
QUEUE_INSERT_TAIL(&loop->name##_handles, q);
// 执行回调函数
h->name##_cb(h);
}
}
void uv__##name##_close(uv_##name##_t* handle) {
uv_##name##_stop(handle);
}
UV_LOOP_WATCHER_DEFINE(prepare, PREPARE)
UV_LOOP_WATCHER_DEFINE(check, CHECK)
UV_LOOP_WATCHER_DEFINE(idle, IDLE)
利用宏定义,在预处理阶段拓展成三个不同类型,但是处理逻辑一样的代码。有三种类型,分别是prepare,check,idle。
上述就是小编为大家分享的如何分析libuv中的idle、check、prepare阶段了,如果刚好有类似的疑惑,不妨参照上述分析进行理解。如果想知道更多相关知识,欢迎关注行业资讯频道。
队列
阶段
类型
节点
分析
三个
函数
时候
循环
内容
标记
结构
一轮
处理
不同
专业
中小
事件
代码
任务
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
校园网络安全有奖竞赛的题库
串口服务器在智能停车场的应用
杭州萧山网络安全招聘
计算机网络技术入门好的书籍
计算机网络技术中常见问题
华图网络安全
机读卡阅卷软件开发
数据库管理系统的分层
石家庄学子软件开发有限公司
连线网络技术股份有限公司
网站用云服务器
nba数据库停更
sqlserver数据库专栏
网络安全需要学历高
广州邦聚网络技术有限公司招聘
excel服务器安装配置
手持终端软件开发
去掉两列中相同的数据库
网络安全建设重点任务责任清单
数据库修改技术
七日杀服务器查询
电话卡的服务器地址是什么意思
sql studio数据库
软件开发人员素质模型
软件开发求购
福建厦门dns服务器地址云空间
护描网络安全课的知识
python爬取外贸数据库
吴江区正规软件开发品质保障
计算机三级网络技术入口