`
luckyclouds
  • 浏览: 111519 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

libevent中事件优先级实现过程

    博客分类:
  • c
阅读更多
首先它是通过指向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实现http服务器实现文件下载功能

    在libevent中,我们可以通过创建一个event_base对象来初始化事件基础,然后监听一个或多个端口。当有新的连接到来时,libevent会回调我们注册的事件处理函数。 在Qt5.15.2环境中,我们可以利用其丰富的类库,比如...

    libevent参考手册中文版_libevent-2.1.5.pdf

    创建event_base是libevent中事件循环的核心。本手册提供了创建默认event_base的方法,并介绍了如何创建复杂的event_base,以及如何检查event_base的后端方法和如何释放event_base。此外,手册还介绍了如何设置event_...

    Libevent 服务端 客户端 代码实现

    在Libevent中,我们可以使用`event_base_new()`创建一个事件基础结构,然后用`event_set()`设置监听套接字的事件。当有新的连接到来时,通过`event_add()`将这个连接的读事件添加到事件基础结构中,让Libevent监控。...

    libevent web服务器实现

    这是一个使用libevent实现的web服务器,客户端采用CInternetSession来实现的,是一个完整的可用的例子,项目采用cmake来管理。提供给大家参考,有问题可以邮件给buptxu@qq.com,多谢。

    libevent和线程池配合实现的高并发tcp服务器

    全部C代码,linux下的线程池和libevent配合实现的高并发tcp服务器,tcp通讯采用分帧的方式发包,帧包含帧头和数据部分,使用libevent的bufferevent方式来实现的帧提取,可直接使用GCC来编译。还配套有一个C#写的...

    libevent2.1.7在Linux安装过程

    libevent2.1.7在Linux安装过程 ...libevent2.1.7在Linux安装过程需要遵循特定的步骤,包括解压缩源代码包、执行autoreconf命令、编译和安装libevent库、查看安装结果,并在QT或C环境中正确使用libevent库。

    这是一个基于libevent事件库实现的FTP服务器,主要实现了文件的上传、下载、删除、目录操作功能C++

    基于libevent事件库实现的FTP服务端 主要实现了文件的上传、下载、删除、目录操作功能 ## 设计思路 采用命令工厂模式,在工厂中注册了`PORT,RETR,STOR`等多个指令,这些指令的处理方式分别由`XFtpTask`的不同...

    libevent实现UDP relay服务器与客户端

    在libevent中,通过事件驱动的编程模型,我们可以高效地处理多个并发连接,使得UDP relay服务器和客户端能够灵活地应对高流量场景。需要注意的是,由于UDP的特性,服务器和客户端都需要考虑数据包的丢失、乱序和重复...

    Libevent 基于事件的

    在 Libevent 中,事件主要分为三种类型: 1. **读写事件**:当一个套接字准备好进行读写操作时,Libevent 会触发相应的回调函数。这对于处理网络通信中的数据接收和发送非常有用。 2. **时间事件**:可以设置定时器...

    运用libevent库实现客户服务器模式

    通过上述过程,我们可以利用`libevent`高效地实现客户端和服务器间的通信。在实际开发中,可以根据需求扩展这个基础模型,比如添加SSL/TLS加密、支持UDP连接、处理复杂的协议等。总的来说,`libevent`为网络编程提供...

    【最新】C++ 使用libEvent实现http的post, get功能

    本篇将深入探讨如何利用libEvent库在C++中实现HTTP的POST和GET请求。 首先,理解HTTP的基本概念至关重要。HTTP(超文本传输协议)是互联网上应用最广泛的一种网络协议,用于客户端和服务器之间的通信。GET和POST是...

    LibEvent定时器事件开发实例

    在LibEvent中,定时器是事件驱动模型的一个重要组成部分,允许开发者以事件回调的形式周期性地执行某些任务。定时器事件分为一次性定时器和周期性定时器两种。一次性定时器事件触发一次后即被销毁,而周期性定时器则...

    libevent参考手册(中文版)_libevent-2.1.5-beta.pdf

    3. 内存管理:libevent中有相应的内存管理接口来优化内存使用。 4. 锁和线程:支持多线程环境下的事件处理,允许开发者使用标准线程库或者自定义线程库。 5. 调试事件:支持调试模式,可以启用一些特定的调试信息。 ...

    libevent中文参考手册

    7. **evrpc**:一个简易的远程过程调用(RPC)框架,简化了远程服务调用的实现过程。 #### 三、库安装与使用 **libevent**在默认情况下安装了几个关键的库: 1. **libevent_core**:包含了所有基础的核心功能,如...

    Windows下libevent C++封装类实现

    windows平台下对于服务器高并发的网络模型选型中,使用libevent是个不错的选择。 本文的背景基于:国内博客对于libevent大多介绍Linux实现,大多是C语言的实现,Windows平台下C++相对较少或者较旧。 本文针对...

    libevent 中文文档.doc

    7. evrpc: 提供了简单的RPC(远程过程调用)实现,使得跨进程通信更加便捷。 libevent 在安装时,默认创建三个库:libevent_core、libevent_extra 和 libevent。libevent_core 包含核心事件和缓冲功能,libevent_...

    Libevent源码解析.pdf

    Libevent 的事件循环是指事件处理机制中的事件触发和处理过程。事件循环是 Libevent 的核心机制,负责处理所有的事件。事件循环可以分为以下几个阶段:事件注册、事件触发、事件处理。 IO 多路复用 Libevent 支持...

    libevent的视频服务器源代码

    1. **连接管理**:Libevent的事件机制可以很好地处理客户端的连接请求,通过监听套接字上的读写事件,实现新连接的接入和数据的接收。 2. **视频流处理**:服务器需要识别并解析视频流格式,如RTMP、HLS、DASH等,...

    libevent 教程

    * 需要处理事件的优先级和调度 8. 小结 libevent 是一个功能强大且高效的异步 IO 库,提供了统一的 API,支持多种操作系统和事件机制。通过学习和使用 libevent,可以快速构建高性能的网络服务器和客户端应用程序...

Global site tag (gtag.js) - Google Analytics