uv_loop_t-事件循环

事件循环是libuv功能的核心部分。它负责轮询I / O并安排基于不同事件源运行的回调。

数据类型

uv_loop_t

     循环数据类型。

uv_run_mode

    用于运行循环的模式uv_run()

typedef enum {
    UV_RUN_DEFAULT = 0,
    UV_RUN_ONCE,
    UV_RUN_NOWAIT
} uv_run_mode;

void (*uv_walk_cb)(uv_handle_t*  handle,void *  arg 

传递给的回调的类型定义uv_walk()

 

公共成员

无效* uv_loop_t.data

用户定义的任意数据的空间。libuv不使用,也不接触此字段

API

int uv_loop_init(uv_loop_t*  loop

    初始化给定的uv_loop_t结构。

int uv_loop_configure(uv_loop_t*  loop,uv_loop_option  option,... )

版本1.0.2中的新功能。

设置其他循环选项。除非另有说明,否则您通常应该在首次调用uv_run()方法之前调用此方法。

如果成功,则返回0;如果失败,则返回UV_E *错误代码。准备处理UV_ENOSYS; 这意味着平台不支持循环选项。

支持的选项:

  • UV_LOOP_BLOCK_SIGNAL:轮询新事件时阻止信号。第二个参数uv_loop_configura()是信号编号。

    当前仅针对SIGPROF信号实现此操作,以抑制使用采样分析器时的不必要唤醒。请求其他信号将失败,并显示UV_EINVAL。

int uv_loop_close(uv_loop_t*  loop

释放所有内部循环资源。仅当循环完成执行并且所有打开的句柄和请求已关闭时才调用此函数,否则它将返回UV_EBUSY。此函数返回后,用户可以释放为循环分配的内存。

uv_loop_t* uv_default_loop( void )

返回初始化的默认循环。如果分配失败,它可能会返回NULL。

此函数只是在整个应用程序中进行全局循环的一种便捷方法,默认循环与初始化的循环没有任何不同uv_loop_init()。这样,可以(并且应该)关闭默认循环,uv_loop_close()以便释放与其关联的资源。

警告 此函数不是线程安全的。

int uv_run(uv_loop_t*  loopuv_run_mode mode

此函数运行事件循环。根据指定的模式,它的行为将有所不同:

  • UV_RUN_DEFAULT:运行事件循环,直到没有更多活动和引用的句柄或请求为止。如果uv_sotp() 被调用并且仍然有活动的句柄或请求,则返回非零值。在所有其他情况下,返回零。
  • UV_RUN_ONCE:轮询一次I / O。请注意,如果没有挂起的回调,此函数将阻塞。完成后返回零(没有活动的句柄或请求),或者非零值(如果期望更多的回调)(意味着您应该在将来的某个时间再次运行事件循环)。
  • UV_RUN_NOWAIT:对I / O进行一次轮询,但如果没有待处理的回调,则不会阻塞。如果完成(没有活动的句柄或请求),则返回零;如果期望更多的回调,则返回非零(意味着您应该在将来的某个时间再次运行事件循环)。

uv_run()不是可重入的。一定不能从回调中调用它。

int uv_loop_alive(const uv_loop_t*  loop)

    如果循环中有引用的活动句柄,活动请求或关闭句柄,则返回非零值。

void uv_stop(uv_loop_t*   loop 

     停止事件循环,导致uv_run()尽快结束。这将在下一次循环迭代之前完成。如果在阻塞I / O之前调用了此函数,则该循环不会在此迭代中阻塞I / O。

size_t uv_loop_size( void )

  返回uv_loop_t结构的大小。对于不想了解结构布局的FFI绑定编写者很有用。

int uv_backend_fd( const uv_loop_t*  loop 

    获取后端文件描述符。仅支持kqueue,epoll和事件端口。

可以将它与uv_run(loop,UV_RUN_NOWAIT)结合使用以轮询一个线程,并在另一个线程中运行事件循环的回调,例如请参见test / test-embed.c。

注意    并非在所有平台上都将kqueue fd嵌入另一个kqueue pollset中。添加fd并不是错误,但它永远不会生成事件。

int uv_backend_timeout( const uv_loop_t *  loop 

     获取轮询超时。返回值以毫秒为单位,如果没有超时,则返回-1。

uint64_t uv_now( const uv_loop_t *   loop 

    返回当前时间戳(以毫秒为单位)。时间戳记在事件循环刻度的开始处进行缓存,uv_update_tiime()有关详细信息和原理,请参见。时间戳从任意时间点单调增加。不要对起点做任何假设,只会让您失望。

注意 使用uv_hrtime(),如果您需要毫秒级的粒度。

void uv_update_time(uv_loop_t *   loop 

更新事件循环的“现在”的概念。Libuv在事件循环周期开始时缓存当前时间,以减少与时间相关的系统调用的数量。

除非您有较长的时间段来阻止事件循环的回调,否则通常不需要调用此函数,在这种情况下,“较长”在某种程度上是主观的,但可能在毫秒或更长的时间内。

void uv_walk(uv_loop_t * loop,uv_walk_cb  walk_cb,void*  arg 

遍历句柄列表:walk_cb将使用给定的arg执行。

int uv_loop_fork(uv_loop_t *  loop

1.12.0版中的新功能。

在fork(2)系统调用之后,重新初始化子进程中必需的任何内核状态。

先前启动的观察者将继续在子进程中启动。

有必要在计划继续在子级中使用的父级进程中创建的每个事件循环上显式调用此函数,包括默认循环(即使您不继续在父级中使用它)。必须先uv_run()使用子循环调用此函数,然后再调用该函数或任何其他API函数。否则,将导致不确定的行为,可能包括重复事件同时传递给父级和子级,或中止子级进程。

如果可能,最好在子进程中创建一个新循环,而不是重用在父进程中创建的循环。在派生之后在子进程中创建的新循环不应使用此功能。

此函数在Windows上未实现,在Windows上它会返回UV_ENOSYS

警告

 

此功能是实验性的。它可能包含错误,并且可能会更改或删除。不保证API和ABI的稳定性。

注意

 

在Mac OS X上,如果父进程中使用目录FS事件句柄进行任何事件循环,则子进程将不再能够使用最有效的FSEvent实现。相反,在子级中使用目录FS事件句柄将退回到用于文件和其他基于kqueue的系统上的相同实现。

警告

 

在AIX和SunOS上,在派生时已在父进程中启动的FS事件句柄将不会在子进程中传递事件。它们必须关闭并重新启动。在所有其他平台上,它们将继续正常运行,而无需任何进一步干预。

警告

 

从中返回的任何先前值uv_backend_fd()现在无效。必须再次调用该函数以确定正确的后端文件描述符。

void* uv_loop_get_data( const uv_loop_t *   loop 

返回loop-> data。

1.19.0版中的新功能。

void * uv_loop_set_data(uv_loop_t *   loop,void *  data )[源代码)

将loop-> data设置为data。

1.19.0版中的新功能。

 

 

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值