前言
在這一小節裏我們將接觸到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
:需要進行初始化的eventint fd
:事件的文件描述符/信號值short events
:事件的類型void (*callback)(int, short, void *)
:回調函數指針。
int
:回調函數第一個參數,對應當前事件的文件描述符/信號值,event->ev_fdshort
:對應當前事件激活類型,event->ev_resvoid *
:對應當前事件的ev_arg
void *arg
:設置回調函數的第3個傳入參數
代碼分析:
這個函數做的無非就是將一個event
設置好初始化的值。不過像鏈表這些變量還沒被賦值,後面添加事件/刪除事件才進行操作。可以看到:
ev->ev_base
設置的值是current_base
,它是一個全局變量。還記得event_init
函數嗎,裏面有條語句是current_base = base;
。ev->ev_flags
一來設置的當前event狀態是EVLIST_INIT
ev->ev_ncalls
以及ev->ev_res
初始值爲0min_heap_elem_init(ev);
,這條語句的作用是初始化跟時間有關的成員,如min_heap_idx
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);
}
參數:
struct event_base *base
:事件ev
準備註冊到的event_base
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);
}
參數:
struct event *ev
:需要設置優先級的事件int pri
:設置的優先級
源碼分析:
這個函數只有兩點需要注意:
- 當前事件如果已經激活,則無法改變優先級
nactivequeues
的初始化值爲1,即只有一種優先級0級。在event_base_new
函數中調用
小結
需要注意的一點是將ev_base
設置了值並不代表event就被註冊在該ev_base
上了,而是有專門的註冊函數。在瞭解了event
各成員如何初始化之後,我們下一節將觀察event是如何註冊到ev_base
上的,以及如何註銷等操作。