首先它是通过指向struct event_list的指针的指针来实现的
在struct event_base结构中体现如下:
/* active event management */
struct event_list **activequeues;
int nactivequeues;
其中nactivequeues为活动事件队列链表数,对应的优先级有0到nactivequeues-1级
默认是1
相应的初始化部分在如下代码:
int
event_base_priority_init(struct event_base *base, int npriorities)
{
int i;
if (base->event_count_active)
return (-1);
if (base->nactivequeues && npriorities != base->nactivequeues) {
for (i = 0; i < base->nactivequeues; ++i) {
free(base->activequeues[i]);
}
free(base->activequeues);
}
/* Allocate our priority queues */
base->nactivequeues = npriorities;
base->activequeues = (struct event_list **)calloc(base->nactivequeues,
npriorities * sizeof(struct event_list *));
if (base->activequeues == NULL)
event_err(1, "%s: calloc", __func__);
for (i = 0; i < base->nactivequeues; ++i) {
base->activequeues[i] = malloc(sizeof(struct event_list));
if (base->activequeues[i] == NULL)
event_err(1, "%s: malloc", __func__);
TAILQ_INIT(base->activequeues[i]);
}
return (0);
}
具体体现在活动事件处理函数中如下:
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 (event_gotsig || base->event_break)
return;
}
}
}
优先级值越小越早处理
分享到:
相关推荐
在libevent中,我们可以通过创建一个event_base对象来初始化事件基础,然后监听一个或多个端口。当有新的连接到来时,libevent会回调我们注册的事件处理函数。 在Qt5.15.2环境中,我们可以利用其丰富的类库,比如...
创建event_base是libevent中事件循环的核心。本手册提供了创建默认event_base的方法,并介绍了如何创建复杂的event_base,以及如何检查event_base的后端方法和如何释放event_base。此外,手册还介绍了如何设置event_...
在Libevent中,我们可以使用`event_base_new()`创建一个事件基础结构,然后用`event_set()`设置监听套接字的事件。当有新的连接到来时,通过`event_add()`将这个连接的读事件添加到事件基础结构中,让Libevent监控。...
这是一个使用libevent实现的web服务器,客户端采用CInternetSession来实现的,是一个完整的可用的例子,项目采用cmake来管理。提供给大家参考,有问题可以邮件给buptxu@qq.com,多谢。
全部C代码,linux下的线程池和libevent配合实现的高并发tcp服务器,tcp通讯采用分帧的方式发包,帧包含帧头和数据部分,使用libevent的bufferevent方式来实现的帧提取,可直接使用GCC来编译。还配套有一个C#写的...
libevent2.1.7在Linux安装过程 ...libevent2.1.7在Linux安装过程需要遵循特定的步骤,包括解压缩源代码包、执行autoreconf命令、编译和安装libevent库、查看安装结果,并在QT或C环境中正确使用libevent库。
基于libevent事件库实现的FTP服务端 主要实现了文件的上传、下载、删除、目录操作功能 ## 设计思路 采用命令工厂模式,在工厂中注册了`PORT,RETR,STOR`等多个指令,这些指令的处理方式分别由`XFtpTask`的不同...
在libevent中,通过事件驱动的编程模型,我们可以高效地处理多个并发连接,使得UDP relay服务器和客户端能够灵活地应对高流量场景。需要注意的是,由于UDP的特性,服务器和客户端都需要考虑数据包的丢失、乱序和重复...
在 Libevent 中,事件主要分为三种类型: 1. **读写事件**:当一个套接字准备好进行读写操作时,Libevent 会触发相应的回调函数。这对于处理网络通信中的数据接收和发送非常有用。 2. **时间事件**:可以设置定时器...
通过上述过程,我们可以利用`libevent`高效地实现客户端和服务器间的通信。在实际开发中,可以根据需求扩展这个基础模型,比如添加SSL/TLS加密、支持UDP连接、处理复杂的协议等。总的来说,`libevent`为网络编程提供...
本篇将深入探讨如何利用libEvent库在C++中实现HTTP的POST和GET请求。 首先,理解HTTP的基本概念至关重要。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于客户端和服务器之间的通信。GET和POST是...
在LibEvent中,定时器是事件驱动模型的一个重要组成部分,允许开发者以事件回调的形式周期性地执行某些任务。定时器事件分为一次性定时器和周期性定时器两种。一次性定时器事件触发一次后即被销毁,而周期性定时器则...
3. 内存管理:libevent中有相应的内存管理接口来优化内存使用。 4. 锁和线程:支持多线程环境下的事件处理,允许开发者使用标准线程库或者自定义线程库。 5. 调试事件:支持调试模式,可以启用一些特定的调试信息。 ...
7. **evrpc**:一个简易的远程过程调用(RPC)框架,简化了远程服务调用的实现过程。 #### 三、库安装与使用 **libevent**在默认情况下安装了几个关键的库: 1. **libevent_core**:包含了所有基础的核心功能,如...
windows平台下对于服务器高并发的网络模型选型中,使用libevent是个不错的选择。 本文的背景基于:国内博客对于libevent大多介绍Linux实现,大多是C语言的实现,Windows平台下C++相对较少或者较旧。 本文针对...
7. evrpc: 提供了简单的RPC(远程过程调用)实现,使得跨进程通信更加便捷。 libevent 在安装时,默认创建三个库:libevent_core、libevent_extra 和 libevent。libevent_core 包含核心事件和缓冲功能,libevent_...
Libevent 的事件循环是指事件处理机制中的事件触发和处理过程。事件循环是 Libevent 的核心机制,负责处理所有的事件。事件循环可以分为以下几个阶段:事件注册、事件触发、事件处理。 IO 多路复用 Libevent 支持...
1. **连接管理**:Libevent的事件机制可以很好地处理客户端的连接请求,通过监听套接字上的读写事件,实现新连接的接入和数据的接收。 2. **视频流处理**:服务器需要识别并解析视频流格式,如RTMP、HLS、DASH等,...
* 需要处理事件的优先级和调度 8. 小结 libevent 是一个功能强大且高效的异步 IO 库,提供了统一的 API,支持多种操作系统和事件机制。通过学习和使用 libevent,可以快速构建高性能的网络服务器和客户端应用程序...