You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
structuv_loop_s {
/* User data - use this for whatever. */void*data;
/* Loop reference counting. */unsigned intactive_handles;
void*handle_queue[2];
union {
void*unused[2];
unsigned intcount;
} active_reqs;
/* Internal flag to signal loop stop. */unsigned intstop_flag;
UV_LOOP_PRIVATE_FIELDS
};
uv_loop_t的声明
直接从uv.h切入,很容易便能找到
uv_loop_t
结构体的声明:需要注意一点:c在声明结构体的时候一定要记得用
typedef
。uv_loop_s的定义
继续顺着
uv.h
往下寻找,便能发现uv_loop_s
的定义:在这里简单描述一下
void* handle_queue[2]
为何定义为具有两个元素的数组,是因为handle队列是一个双向链表,而数组中这两个元素则分别指向next和prev,具体的实现可以参考queue.h:接下来介绍一下联合体
active_reqs
:这个联合体有一个有意思的地方在于
void* unused[2];
,如果有读过老libuv代码的同学应该了解之前的active_reqs
和handle_queue
一样是一个双向链表void* active_reqs[2];
,然而在代码中却没有用到这个queue,所以在新版的libuv中就把active的queue去掉了,取而代之的是一个联合体,而这个联合体之所以加上了void* unused[2];
,是为了向下兼容,防止uv_loop_t
的结构体大小发生变化。在代码中真正用到的则是active_reqs.count
,用来对在线程池中调用的异步I/O进行计数。接下来我们看一下私有宏
UV_LOOP_PRIVATE_FIELDS
,视线转移到unix.h中:这里面简单讲述如下几点:
watcher_queue
为uv__io_t
的观察者queue,其中保存的是uv__io_t
的结构体void* wq[2];
表述的是work queue,也就是线程池;timer_heap
则是timer的二叉堆,这样在进行遍历的时候可以大幅节约遍历所需时间;UV_PLATFORM_LOOP_FIELDS
私有宏跟平台相关,在这里不做过多介绍。至此,整个
uv_loop_t
的结构体基本就介绍完了。The text was updated successfully, but these errors were encountered: