前言
在本小节中,我们将看到event是如何注册到event_base上的,以及如何注销,如何激活等操作,最后还会梳理一下事件的状态是如何变化的。
event_add
int
event_add(struct event *ev, const struct timeval *tv)
{
struct event_base *base = ev->ev_base;
const struct eventop *evsel = base->evsel;
void *evbase = base->evbase;
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 (-1); /* ENOMEM == errno */
}

本文详细介绍了libevent中的event_add和event_del函数,用于事件的注册和注销。通过学习,读者可以理解事件状态的变化,并了解事件如何在libevent框架中被管理和调度。
最低0.47元/天 解锁文章
3500

被折叠的 条评论
为什么被折叠?



