libuv源码剖析(三): 事件循环loop

Introduction

libuv中的 loop 是 libuv 最为核心的事件队列. 在熟悉了 libuv 的高效事件队列 queue, 和基本数据结构 handle 之后, 就需要来了解一下 loop 的实现.
下面通过一个uvbook中具体的实例来讲解.

uv_loop_t 数据结构

我们首先看一下 uv_loop_t 的数据结构:

struct uv_loop_s {
  /* User data - use this for whatever. */
  void* data;
  /* Loop reference counting. */
  unsigned int active_handles;
  void* handle_queue[2];
  void* active_reqs[2];
  /* Internal flag to signal loop stop. */
  unsigned int stop_flag;
  UV_LOOP_PRIVATE_FIELDS
};

其中 void *data 用来存放任意的用户数据, void *handle_queue[2] 就是 handle 的队列, 为什么用两个空指针来表示可以看我之前的源码剖析文章. void *active_reqs[2] 是 request 队列, stop_flag 表示是否运行, 在run和close的时候会观察这个变量.

再然后 UV_LOOP_PRIVATE_FIELDS 是用户不应该操纵的变量, 其中变量较多, 包括了很多队列: idle_handles, pending_queue, watcher_queue等等, 这里就不列举出来了

举个例子

下面以一个较为简单的sample代码为例, 例子来源于 uvbook/code/idle-basic, 稍稍修改了一下, 多加了一个idle_handle

#include <stdio.h>
#include <uv.h>

int64_t counter = 0;

void wait_for_a_while(uv_idle_t* handle) {
    counter++;

    if (counter >= 10e6)
        uv_idle_stop(handle);
}

void do_something(uv_idle_t* handle){
    printf("Do something\n");
    uv_idle_stop(handle);
}

int main() {
    uv_idle_t idler;
    uv_idle_t idler2;
    uv_idle_init(uv_default_loop(), &i
  • 0
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值