event_new的实现其实是间接的调用的event_assign,首先调用mm_malloc分配一块内存,然后调用event_assign来给event类型的对象各个成员赋值。 1structevent*2event_new(structevent_base *base, evutil_socket_t fd,shortevents,void(*cb)(evutil_socket_t,short,void*),void*arg)3{4structevent*ev;5ev = mm_mall...
这两种方式的区别就是,event_assign是在栈上分配一个对象,然后给成员赋值;而event_new是在堆上分配一个对象,然后给成员赋值。
此时,就可以通过evsignal_new函数来创建一个信号event了,实际上就是创建了一个EV_SIGNAL|EV_PERSIST的永久信号事件。而该函数内部实际上又会调用event_assign函数。需要注意的是,创建普通event时第二个参数传入的是需要监听的的文件描述符,而这里创建信号event时传入的第二个参数则应当是需要监听的信号值了,比如说需...
对于已经在event_base中处于“挂起”状态的event,永远不要调用event_assign。这样做会导致极为难以诊断的错误。如果event已经初始化,并且处于“挂起”状态,那么在调用event_assign之前应该先调用event_del。* //申请内存创建event ,内部使用event_assign赋值 struct event *event_new(struct event_base *, evutil_socke...
event_assign(&eonce->ev, base, fd, events, event_once_cb, eonce); } else { /* Bad event combination */ mm_free(eonce); return (-1); } if (res == 0) { EVBASE_ACQUIRE_LOCK(base, th_base_lock); if (activate) event_active_nolock_(&eonce->ev, EV_TIMEOUT, 1); ...
evcb_flag:事件的状态阶段标记,比如通过event_assign初始化一个已经创建的event实例时(event包含一个event_callback实例),会将evcb_flag设置为EVLIST_INIT状态,而插入io这个map时,它会添加多一个位evcb_flag |= EVLIST_INSERTED,当被插入activate_queue的时候,会添加多一个标记evcb_flag |= EVLIST_ACTIVE。它...
event_assign(struct event *ev, struct event_base *base, evutil_socket_t fd, short events, void (*callback)(evutil_socket_t, short, void *), void *arg) 函数event_assign完成的功能是对event结构体的初始化工作 event_assign函数 以上对base_event和event 进行了初始化相关操作,二者还没有进行关联...
event_assign(ev, base, sockfd, EV_READ | EV_PERSIST, socket_read_cb, (void*)ev); event_add(ev, NULL); } void socket_read_cb(int fd, short events, void* arg) { char msg[4096]; struct event* ev = (struct event*)arg;
首先函数入口处直接把参数里的callback赋值给了event_once->cb,它用来负责实际的事件回调。然后调用event_assign新建一个event初始化event_once->event的同时,传入了一个event_once_cb回调函数。这个函数才是事件发生时会被回调的函数,也是一次性事件的秘密所在:...
event_assign(&base->sig.ev_signal, base, base->sig.ev_signal_pair[1], EV_READ | EV_PERSIST, evsig_cb, &base->sig.ev_signal);struct evsig_info中的sig.ev_signal_pair[2]通过unix socket 域连接起来,对于每个要添加处理函数的signal,我们都给它注册同一个信号处理函数,实现如下:...