[libevent]event_process_active()

static void
event_process_active(struct event_base *base)
{
	struct event *ev;
	struct event_list *activeq = NULL;
	int i;
	short ncalls;

	for (i = 0; i < base->nactivequeues; ++i) {//获得就绪链表中有就绪事件并且高优先级的表头
		if (TAILQ_FIRST(base->activequeues[i]) != NULL) {
			activeq = base->activequeues[i];
			break;
		}
	}

	assert(activeq != NULL);

	for (ev = TAILQ_FIRST(activeq); ev; ev = TAILQ_FIRST(activeq)) {
		if (ev->ev_events & EV_PERSIST)
			event_queue_remove(base, ev, EVLIST_ACTIVE);//移除就绪链表
		else
			event_del(ev);//如果不是永久事件则需要进行一系统的删除工作,包括移除注册在事件链表的事件等
		
		/* Allows deletes to work */
		ncalls = ev->ev_ncalls;
		ev->ev_pncalls = &ncalls;
		while (ncalls) {//根据回调次数调用回调函数
			ncalls--;
			ev->ev_ncalls = ncalls;
			(*ev->ev_callback)((int)ev->ev_fd, ev->ev_res, ev->ev_arg);
			if (base->event_break)
				return;
		}
	}
}

### libevent 源码学习教程详解 #### 了解基础概念与应用场景 对于任何库的学习,理解其设计目的和典型的应用场景至关重要。libevent 是一个用于异步事件处理的 C 库,广泛应用于网络编程领域。通过研究 libevent 的基本使用案例可以更好地掌握其实现原理及其优势所在[^1]。 #### 掌握核心数据结构 深入探索 libevent 的内部机制离不开对其所采用的数据结构的认识。例如,在实现高效的定时器管理方面,libevent 使用了小根堆来优化时间复杂度;而在某些情况下,则会利用双向链表(TAILQ)来进行快速插入删除操作[^2][^4]。熟悉这些底层支持有助于更深层次的理解整个框架的工作方式。 #### 关键API解析 为了能够灵活运用 libevent 进行开发工作,必须深入了解几个重要的 API 函数: - `int event_add(struct event *ev, const struct timeval *tv)`:向事件循环注册一个新的 I/O 或者超时事件。 - `int event_del(struct event *ev)`:取消之前已注册过的某个特定类型的监听请求。 - `int event_base_loop(struct event_base *base, int flags)`:启动并维持一个持续运行直到遇到指定条件为止的任务调度中心。 - `void event_active(struct event *ev, int res, short ncalls)` 和 `static int event_process_active(struct event_base *base)`:负责激活符合条件的回调函数执行以及后续清理动作[^3]。 #### 实践练习项目建议 理论联系实际是巩固知识最有效的方式之一。可以从简单的客户端服务器通信模型开始尝试构建基于 libevent 的应用程序,逐步过渡到更加复杂的多线程环境下的高并发解决方案的设计与实施过程之中去。 ```c #include <event.h> // 示例代码片段展示如何创建并配置一个 basic TCP echo server. struct bufferevent* bev; bev = bufferevent_socket_new(base, -1, BEV_OPT_CLOSE_ON_FREE); bufferevent_setcb(bev, readcb, NULL, eventcb, (void*)arg); bufferevent_enable(bev, EV_READ|EV_WRITE); event_base_dispatch(base); // 启动事件循环等待连接到来... ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值