在使用libevent函數以前,首先須要調用其event_init函數進行初始化。
初始化過程主要是建立一個全局默認的current_base變量,其類型爲
struct event_base。
struct event_base對象變量可由eventn_base_new()函數建立並初始化。
libevent中,部分函數默認直接操做全局current_base,部分相同功能函數
可特別指定由event_base_new()建立的其餘struct event_base變量,如:
event_set()默認操做的全局current_base變量,
event_base_set()則操做指定的event_base變量。
函數
該函數將調用event_base_new()函數,建立並初始化一個struct event_base對象,
並將該對象賦值給全局變量current_base,做爲全局默認的event_base。oop
event_base_new()則用於建立一個新的event_base結構對象,並對其進行初始化。
初始化過程包括選擇使用的IO事件模型,建立事件隊列等。
性能
struct event_base { const struct eventop *evsel; void *evbase; int event_count; /* counts number of total events */ int event_count_active;/* counts number of active events */ int event_gotterm; /* Set to terminate loop */ int event_break; /* Set to terminate loop immediately */ struct event_list **activequeues; int nactivequeues; struct evsignal_info sig; struct event_list eventqueue; struct timeval event_tv; struct min_heap timeheap; struct timeval tv_cache; };
evsel: 當前使用的系統IO事件模型的抽象接口,event_base_new()函數會
按順序檢測可用的IO事件模型,該順序爲:
event ports, kqueue, epool, /dev/poll, poll, select.
evbase: evsel->init()的執行結果。在event_base_new()中,使用evsel->init()
的返回值判斷特定的IO事件模型是否可用。(返回NULL則不可用)
event_count: 當前event base中包含的事件數。
event_count_active: 當前event base中活動的事件數。
activequeues: 活動事件的隊列。
nactivequeues: activequeues的長度
eventqueue: 當前event base中包含全部event的列表。
event_tv: 在event_base_new中,設置爲當前時間。
timeheap: libevent庫使用一個最小堆結構,保存各個事件的超時時間,
從而能夠優化超時判斷的性能。優化