(六)初始化并设置event

libevent源码分析--event_set()函数 如果按照正常使用libevent库的流程来说,首先调用event_init()函数,然后调用event_set()函数,然后event_add()函数,然后是event_dispatch()函数。 1、event_init() 创建一个event_base对象也就是创建一个新的libevent实例,该函数同时还堆新生成的libevent实例进行了初始化。首先为event_base实例申请了空间, 阅读详情

前言

在这一小节里我们将接触到event.c源文件里面的一些关于设置event接口函数。这对我们了解event以及它和event_base之间的联系很有帮助。

event_set

首先我们看一看初始化event的操作:

void
event_set(struct event *ev, int fd, short events,
      void (*callback)(int, short, void *), void *arg)
{
    /* Take the current base - caller needs to set the real base later */
    ev->ev_base = current_base;

    ev->ev_callback = callback;
    ev->ev_arg = arg;
    ev->ev_fd = fd;
    ev->ev_events = events;
    ev->ev_res = 0;
    ev->ev_flags = EVLIST_INIT;
    ev->ev_ncalls = 0;
    ev->ev_pncalls = NULL;

    min_heap_elem_init(ev);

    /* by default, we put new events into the middle priority */
    if(current_base)
        ev->ev_pri = current_base->nactivequeues/2;
}
参数:
  • struct event *ev:需要进行初始化的event
  • int fd:事件的文件描述符/信号值
  • short events:事件的类型
  • void (*callback)(int, short, void *):回调函数指针。
    1. int:回调函数第一个参数,对应当前事件的文件描述符/信号值,event->ev_fd
    2. short:对应当前事件激活类型,event->ev_res
    3. void *:对应当前事件的ev_arg
  • void *arg:设置回调函数的第3个传入参数
代码分析:

这个函数做的无非就是将一个event设置好初始化的值。不过像链表这些变量还没被赋值,后面添加事件/删除事件才进行操作。可以看到:

  1. ev->ev_base设置的值是 current_base,它是一个全局变量。还记得event_init函数吗,里面有条语句是current_base = base;。
  2. ev->ev_flags一来设置的当前event状态是EVLIST_INIT
  3. ev->ev_ncalls以及ev->ev_res初始值为0
  4. min_heap_elem_init(ev);,这条语句的作用是初始化跟时间有关的成员,如min_heap_idx
  5. ev->ev_pri = current_base->nactivequeues/2;,这条语句的作用就是设置初始优先级(nactivequeues成员代表一共有nactivequeues个不同的优先级)

event_base_set

int
event_base_set(struct event_base *base, struct event *ev)
{
    /* Only innocent events may be assigned to a different base */
    if (ev->ev_flags != EVLIST_INIT)
        return (-1);

    ev->ev_base = base;
    ev->ev_pri = base->nactivequeues/2;

    return (0);
}
参数:
  1. struct event_base *base:事件ev准备注册到的event_base
  2. struct event *ev:当前事件ev
代码分析:

从ev->ev_flags != EVLIST_INIT就退出可以看到,只有处于初始化状态的event才能被设置为准备注册到另一个event_base上。而在默认情况下,都是注册到current_base上的,在event_set函数中很清晰。

event_priority_set

int
event_priority_set(struct event *ev, int pri)
{
        //如果当前事件已经处于激活状态了,则无法改变优先级了
        if (ev->ev_flags & EVLIST_ACTIVE)
                return (-1);
        //如果传入的pri的大小不符合则退出(再次提醒,nactivequeues代表有多少种优先级,默认是1,从0开始计算)
        if (pri < 0 || pri >= ev->ev_base->nactivequeues)
                return (-1);
        //设置优先级
        ev->ev_pri = pri;

        return (0);
}
参数:
  1. struct event *ev:需要设置优先级的事件
  2. int pri:设置的优先级
源码分析:

这个函数只有两点需要注意:

  1. 当前事件如果已经激活,则无法改变优先级
  2. nactivequeues的初始化值为1,即只有一种优先级0级。在event_base_new函数中调用

小结

需要注意的一点是将ev_base设置了值并不代表event就被注册在该ev_base上了,而是有专门的注册函数。在了解了event各成员如何初始化之后,我们下一节将观察event是如何注册到ev_base上的,以及如何注销等操作。

libevent源码分析--event_init()函数 尝试着解释几个重要的函数,首先是event_inint()函数,这个函数式最初就需要使用的函数,此函数初始化了一个全局的变量current_base,也就是event_base,默认情况下所有的event都是在想这个变量中添加。 struct event_base *event_init(void) { struct event_base *base = event_base_new 阅读详情

相关推荐

ebpf perf_event使用流程

本文介绍了ebpf的perf_event的使用流程

hubingsong的博客 2104

libevent event_set函数与event_add函数解析 [SYM]

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_34117522的博客 1087

[多智能体强化学习] 王树森YouTube课程笔记

前言 近期在设计V2X资源分配任务下的状态空间和动作空间,可以说是一筹莫展,是自己菜,现在看来可能也是涉及到一些关于多智能体强化学习实现过程中过于细节的点,目前的知识储备还不够。因此打算用半周到一周的时间重电,希望之后能有进展。 本文内容来自于友人LX所推荐的油管教程,链接如下:多智能体强化学习,一共两节课40min左右。教程废话不多干货不少,老师的声音还好听,推荐直接去看原教程。 这里还要多一嘴,那就是对于强化学习来说,单主体和多主体的界限,在某种程度上来说是很模糊的,并不是场景中有多个主体需要..

观林望实的博客 3363

[libevent源码分析] event_set

libevent源码分析

Ubuntu黑客 2080

基于Docker的D435i相机与IMU联合标定实战指南

本文详细介绍了基于Docker的D435i相机与IMU联合标定实战指南,涵盖kalibr镜像构建、IMU标定全流程、双目相机标定技巧及联合标定结果验证。通过Docker容器化部署,简化了复杂依赖环境,提升标定效率与精度,适用于机器人视觉与SLAM应用。

weixin_30872337的博客 239

(二)目标检测之 HOG+SVM 算法

文章目录一、概述二、方法概述三、积分图四、AdaBoost五、级联检测六、结果七、复现八、总结参考资料 一、概述   梯度直方图HOG(Histogram of Oriented Gradients)是法国人Dalal在2005年CVPR会议上提出的特征提取算法,并将其与 SVM 配合,用于行人检测。论文地址:Histograms of oriented gradients for human detection HOG有个优点,提取的边缘和梯度特征能很好的抓住局部形状的特点,且因是对图像做了Gamma

天青如水的博客 1万+

Libevent学习

1)事件2)事件集合3)关联的文件描述符4)事件类型5)回调函数6)回调函数的参数1)basestruct event_base类型的指针,表示事件集合2)cbevconnlistener_cb类型的回调函数指针,用于处理新连接的事件。其中:evconnlistener_cb类型3)ptr传递给回调函数的参数指针4)flags标志位,可以是或等选项其中:5)backlog:监听队列的长度。

qq_50615776的博客 4189

ROM和RAM在单片机程序运行理解

ROM和RAM是电子设备中两种核心存储组件,主要区别在于:ROM用于长期存储系统程序、用户文件等固定数据,断电后数据不丢失,但写入速度较慢;RAM则用于临时存储运行中的程序和数据,读写速度快但断电后数据会清空。在单片机中,ROM存储程序代码和常量,RAM存储运行时的变量和数据。两者协同工作,ROM如同"永久档案库"保存必要信息,RAM则像"临时工作台"支持高速运算,共同确保设备正常运行。

qq_37999850的博客 1619

[libevent]event_set()

void event_set(struct event *ev, int fd, short events, void (*callback)(int, short, void *), void *arg) { /* Take the current base - caller needs to set the real base later */ ev->ev_base = curre

scnuxiaotao的博客 900

海康威视iVMS-8700综合安防管理平台 文件读取漏洞复现

HIKVISION iVMS 综合安防管理平台download接口处存在任意文件读取漏洞,攻击者通过构造token绕过身份认证,读取服务器中的目录信息与敏感文件。使系统处于极不安全的状态。

0xSec 3304

JSON 与 JSON-RPC 的区别

JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,基于文本,采用人类可读的语法来表示结构化数据。它起源于JavaScript,但如今已被几乎所有主流编程语言支持。标准文档:RFC 4627数据类型:支持 String、Number、Boolean、Null、Object、Array 六种基本类型格式示例"name": "张三","age": 30,JSON-RPC(JSON Remote Procedure Call)是一种远程过程调用(RPC)协议。

h a 6 6 6 c k 为 你解决复杂难题! 144

event 初始化

在前面我们对整个libevent重要的核心(event和event_base)结构做了分析, 处于茫然你现在跟着再来看一下event的初始化过程, 以及事件的注册/注销过程. event 初始化 event的成员有很多, 所以我们需要对event初始化操作做一个简单的封装才行, 不然用户怎么可能不会记错记混这些参数呢. event初始化函数是 event_set. void event_set(s...

啦啦啦 836

GPS天线结构、原理、测试

【有源陶瓷天线构成】GPS天线是由接收天线和前置放大器两个部件组成。GPS接收天线的作用,是将卫星来的无线电信号的电磁波能量变换成接收机电子器件可摄取应用的电流。绝大部分内置GPS天线为右旋极化陶瓷介质,其组成部分为:陶瓷天线、低噪音信号模块、线缆、[接头](h

数字世界 万物互联 2万+

Nginx源码分析 - Event事件篇 - Event模块和配置的初始化(16)

目录 一、Event模块的数据结构 1. event事件模块的配置 2. ngx_events_module 事件模块 3. ngx_event_core_module 事件核心模块 4. ngx_event_conf_t 事件conf结构 二、Event模块结构图 三、Event模块的初始化 1. ngx_event_module_init 模块初始化函数 四、Event模块配置的初始化 1. ngx_events_module 模块配置初始化 2. ngx_conf_parse 解

alpha_love的博客 650

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

Probability and Statistics - 4th edition

Probability and Statistics - 4th edition

event_base

这个函数告诉event_config在生成多线程event_base的时候,应该试图使用给定数目的CPU。这个函数的工作与event_base_new()类似,它将分配的event_base设置成当前的。选择各种方法时,函数会选择OS支持的最快方法。本文描述的函数有一些用于操作当前event_base的变体,这些函数与新版本函数的行为类似,只是它们没有event_base参数。这个函数在new_event_base被调用,传入的参数是event_config,根据cfg的内容来配置event_base。

hesphoros的个人博客 1624

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

Nginx源码分析 - Event事件篇 - Event模块的进程初始化(18)

目录 一、源码分析 1. Event核心模块ngx_event_core_module 2. Event模块初始化ngx_worker_process_init 3. 初始化核心函数ngx_event_process_init 二、TCP连接和读取事件逻辑 1. ngx_event_process_init 初始化事件循环 2.ngx_http_init_connection 初始化http连接,读取read事件数据 3. ls->handler的回调函数是如何赋值的 前面一篇我..

alpha_love的博客 470

pygame学习(一)——pygame库的导包、初始化、窗口的设置、打印文字

pygame是一个跨平台Python库(),专门用来开发游戏。pygame主要为开发、设计2D电子游戏而生,提供图像模块(image)、声音模块(mixer)、输入/输出(鼠标、键盘、显示屏)模块等。使用pygame,理论上可以开发设计市面上所有的2D类型游戏。优点:pygame免费、开源,支持多种操作系统,具有良好的跨平台性。适用范围:pygame适合小型2D游戏开发,比如飞机大战、贪吃蛇、扫雷等。游戏越大,开发越困难。另外,在使用pygame之前需要先安装。

码银的博客 6243

Event loop

一旦有了一个已经注册了某些事件的event_base,就需要让libevent等待事件并且通知事件的发生。

hesphoros的个人博客 1091

event 信号初始化

上一节我们对信号evsignal_info作了一个简单的分析, 本节就如同前面分析event功能函数时一样的来分析signal操作. 信号初始化 evsignal_init函数实现对一个信号的初始化操作. 源码位置: signal.c int evsignal_init(struct event_base *base) { int i; /* * Our signal handler ...

啦啦啦 703

UEFI BIOS 之 Event 详细介绍

中断:CPU执行程序时,由于发生了某种随机的事件,引起CPU暂时中断正在运行的程序,转去执行一段特殊的服务程序(中断服务子程序或中断处理程序),以处理该事件,该事件处理完后又返回被中断的程序继续执行,这一过程称为中断传统的中断模式硬件中断- 敲键盘→键盘信号传输给EC→EC产生硬件中断 (IRQ)到CPU→中断信号输入到CPU的中断控制器→OS执行对应的软件代码来获取键盘按键。

qq_43561214的博客 2164

libevent的event_config 配置相关接口

本文介绍了libevent的event_config配置相关接口

一个致力于开源代码学习、分析和交流的博客 1337

创建event_base

在使用libevent函数之前,你需要至少创建一个event_base。每个event_base保护一组event并可以轮选检测那个event是活跃的。 如果一个event_base设置为使用锁,多个线程可以对其安全的访问。它的循环只能在单线程中运行。如果想有多个线程轮询IO,则每个线程都需要有一个event_base. 每个event_base都有一个方法来判断那个event是活跃的。公认的

hai200501019的专栏 608
上一篇: (五)struct event结构体
下一篇: (七)注册/注销event事件
UKey_
博客等级 码龄10年 258粉丝 186原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值