Libevent源碼分析—event_set()


初始化完event_base后,下面要初始化event,通過調用event_set()實現 。相關源碼位於event.c

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 = current_base;    //設置event屬於當前base;current_base通過event_init()設置
    ev->ev_callback = callback;    //設置回調函數
    ev->ev_arg = arg;    //設置回調函數的3個參數
    ev->ev_fd = fd;
    ev->ev_events = events;
    ev->ev_res = 0;
    ev->ev_flags = EVLIST_INIT;    //設置event狀態
    ev->ev_ncalls = 0;
    ev->ev_pncalls = NULL;
    min_heap_elem_init(ev);    //初始化event在小根堆中索引為-1    min_heap.h
    /* by default, we put new events into the middle priority */
    if(current_base)
        ev->ev_pri = current_base->nactivequeues/2;    //設置event優先級
}
通過傳入的參數:fd, events, 回調函數,arg設置event的相應成員,並初始化event在小根堆中的索引為-1,以及設置event的優先級。
 
接下來調用event_base_set()設置event所屬的event_base。
 
其實在event_set()中已經將event所屬的event_base設置為當前的current_base,而current_base在event_init()中被賦值為新建的event_base。所以,如果要將一個新的event捆綁的event_base設置為新建的event_base,則可以不需要event_base_set()這步調用。如果有多個event_base,則才需要這步;就一個event_base時,是不需要這步的,因為此時current_base就等於event_base。

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)    //只能對新建的event設置其所屬event_base
        return (-1);
    ev->ev_base = base;    //設置所屬event_base
    ev->ev_pri = base->nactivequeues/2;    //設置優先級
    return (0);
}
由上面代碼可看到,只能對新建的狀態為EVLIST_INIT的event設置所屬event_base
 
event有優先級,我們還可以單獨調用下面的函數來專門設置event的優先級,但要求不能對活躍的event設置。

event_priority_set()

int
event_priority_set(struct event *ev, int pri)
{
    if (ev->ev_flags & EVLIST_ACTIVE)    //不能對活躍的event設置優先級
        return (-1);
    if (pri < 0 || pri >= ev->ev_base->nactivequeues)
        return (-1);
    ev->ev_pri = pri;    //設置優先級
    return (0);
}

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM