(六)初始化並設置event

前言

在這一小節裏我們將接觸到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上的,以及如何註銷等操作。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章