博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
libuv之idle、check、prepare---loop-watcher.c
阅读量:6711 次
发布时间:2019-06-25

本文共 3834 字,大约阅读时间需要 12 分钟。

#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。复制代码

转载地址:http://kqolo.baihongyu.com/

你可能感兴趣的文章
TOP 13大最热开源微服务Java框架
查看>>
想知道垃圾回收暂停的过程中发生了什么吗?查查垃圾回收日志就知道了!
查看>>
案例学习:Jigsaw模块化迁移
查看>>
ASP.NET 2.2 Preview 1首次支持Java SignalR客户端
查看>>
Netty 源码分析之 零 磨刀不误砍柴工 源码分析环境搭建
查看>>
[deviceone开发]-动画示例源码
查看>>
实现iOS图片等资源文件的热更新化(一): 从Images.xcassets导出合适的图片
查看>>
magento2 ajax机制 (customer-data)
查看>>
【二次元的CSS】—— CSS3画的能换频道的电视机(合集)
查看>>
magento 2模块开发实例helloworld模块
查看>>
关于if-else流程图的画法
查看>>
一天一点linux(10):ubuntu如何设置静态IP和动态IP?
查看>>
AndroidStudio好用的插件
查看>>
聊一聊 JS 中的『隐式类型转换』
查看>>
calc 与 box-sizing 的替代
查看>>
如何使用 Java 构建微服务?
查看>>
通过 SignalR 类库,实现 ASP.NET MVC 的实时通信
查看>>
[x98 air 3g平板]安装任意版本32位win10的方法
查看>>
12个用得着的JQuery代码片段
查看>>
Apache POI 4.1.0 发布,Office 文档的 Java API
查看>>