event 注册和注销

本文详细分析了libevent库中event的注册和注销功能,包括event_queue_insert和event_queue_remove函数的实现。在注册过程中,如果设置了定时器,事件会被添加到小根堆;如果事件已经存在I/O或信号标志,且未初始化或不在就绪队列中,则会插入到就绪队列。注销时,事件将从所有队列中删除,并根据状态解除相应的监听。
摘要由CSDN通过智能技术生成

本节我们依旧来分析event的操作, 接着上节没有讲完的关于event的注册和注销两个功能的实现.

event 注册

依旧来看一个event 注册函数的原型

int event_add(struct event *ev, const struct timeval *tv);

相比event_set函数event_add真的很干净.

参数

  • ev : 将要注册的event事件. 其实实际注册的是ev->ev_base.
  • tv : 设置超时时间. 如果tv != NULL则会同时注册定时事件, 将ev添加到timer堆上.

函数源码event.c

函数真的很长, 不慌, 我们慢慢的分析(基本在注释中).

// 设置事件的定时. 实质 : 注册事件
// 1. 如果设置定时, 则先在小根堆上申请一个注册的空间
// 2. 如果事件已经处于定时队列, 则将其从定时队列中移除
// 3. 如果事件已经在就绪队列中, 则将其从就绪队列中移除
// 4. 重新设置定时时间, 并将其插入到定时队列中
int
event_add(struct event *ev, const struct timeval *tv)
{
   
	struct event_base *base = ev->ev_base;	// 指向要注册的 ev_base
	const struct eventop *evsel = base->evsel;
	void *evbase = base->evbase;	// base 所使用的IO成员
	int res = 0;

	event_debug((
		 "event_add: event: %p, %s%s%scall %p",
		 ev,
		 ev->ev_events & EV_READ ? "EV_READ " : " ",
		 ev->ev_events & EV_WRITE ? "EV_WRITE " : " ",
		 tv ? "EV_TIMEOUT " : " ",
		 ev->ev_callback));

	assert(!(ev->ev_flags & ~EVLIST_ALL));

	/*
	 * prepare for timeout insertion further below, if we get a
	 * failure on any step, we should not change any state.
	 */
	// 如果设置了定时, 则现在先在小根堆上分配一个空位留给定时事件, 保证注册定时事件时不会失败
	if (tv != NULL && !(ev->ev_flags & EVLIST_TIMEOUT)) {
   
		if (min_heap_reserve(&base->timeheap,
			1 + min_heap_size(&base->timeheap)) == -1)
			return (-
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值