libevent原始碼分析(2)--2.1.8--結構體 struct event和struct event_callback
阿新 • • 發佈:2019-01-30
一、event_callback結構體
struct event_callback { //下一個回撥事件 TAILQ_ENTRY(event_callback) evcb_active_next; //回撥事件的狀態標識,具體為: // #define EVLIST_TIMEOUT 0x01 // event在time堆中,min_heap // #define EVLIST_INSERTED 0x02 // event在已註冊事件連結串列中,event_base的queue中 // #define EVLIST_SIGNAL 0x04 // 未見使用 // #define EVLIST_ACTIVE 0x08 // event在啟用連結串列中,event_base的active_queue中 // #define EVLIST_INTERNAL 0x10 // 內部使用標記 // #define EVLIST_ACTIVE_LATER 0x20 event在下一次啟用連結串列中 // #define EVLIST_INIT 0x80 // event已被初始化 // #define EVLIST_ALL 0xff // 主要用於判斷事件狀態的合法性 short evcb_flags; // 回撥函式的優先順序,越小優先順序越高 ev_uint8_t evcb_pri; /* smaller numbers are higher priority */ // 執行不同的回撥函式 /** @name Event closure codes Possible values for evcb_closure in struct event_callback @{ */ /** A regular event. Uses the evcb_callback callback */ //表明是常規的讀寫事件,執行evcb_callback回撥 #define EV_CLOSURE_EVENT 0 /** A signal event. Uses the evcb_callback callback */ // 表明是訊號,執行evcb_callback回撥 #define EV_CLOSURE_EVENT_SIGNAL 1 /** A persistent non-signal event. Uses the evcb_callback callback */ // 表明是永久性的非訊號事件,使用evcb_callback回撥 #define EV_CLOSURE_EVENT_PERSIST 2 /** A simple callback. Uses the evcb_selfcb callback. */ // 表明是簡單的回撥,使用evcb_selfcb回撥 #define EV_CLOSURE_CB_SELF 3 /** A finalizing callback. Uses the evcb_cbfinalize callback. */ // 表明是結束型回撥,使用evcb_cbfinalize回撥 #define EV_CLOSURE_CB_FINALIZE 4 /** A finalizing event. Uses the evcb_evfinalize callback. */ // 表明是結束事件,使用evcb_evfinalize回撥 #define EV_CLOSURE_EVENT_FINALIZE 5 /** A finalizing event that should get freed after. Uses the evcb_evfinalize * callback. */ // 正在結束的事件後面應該釋放;使用evcb_evfinalize回撥 #define EV_CLOSURE_EVENT_FINALIZE_FREE 6 /** @} */ ev_uint8_t evcb_closure; /* allows us to adopt for different types of events */ // 允許我們自動適配不同型別的回撥事件 union { void (*evcb_callback)(evutil_socket_t, short, void *); void (*evcb_selfcb)(struct event_callback *, void *); void (*evcb_evfinalize)(struct event *, void *); void (*evcb_cbfinalize)(struct event_callback *, void *); } evcb_cb_union; // 回撥引數 void *evcb_arg; };
二、event結構體
struct event { // event的回撥函式,被event_base呼叫 // 具體定義在上面 // 以下為一些常用的巨集定義 // #define ev_pri ev_evcallback.evcb_pri // #define ev_flags ev_evcallback.evcb_flags // #define ev_closure ev_evcallback.evcb_closure // #define ev_callback ev_evcallback.evcb_cb_union.evcb_callback // #define ev_arg ev_evcallback.evcb_arg struct event_callback ev_evcallback; /* for managing timeouts */ // 用來管理超時事件 union { // 公用超時佇列 TAILQ_ENTRY(event) ev_next_with_common_timeout; // min_heap最小堆索引 int min_heap_idx; } ev_timeout_pos; // 如果是I/O事件,ev_fd為檔案描述符;如果是訊號,ev_fd為訊號 evutil_socket_t ev_fd; // libevent控制代碼,每個事件都會儲存一份控制代碼 struct event_base *ev_base; // 用共用體來同時表現IO事件和訊號 // 以下為一些方便呼叫的巨集定義 /* mutually exclusive */ // #define ev_signal_next ev_.ev_signal.ev_signal_next // #define ev_io_next ev_.ev_io.ev_io_next // #define ev_io_timeout ev_.ev_io.ev_timeout /* used only by signals */ // #define ev_ncalls ev_.ev_signal.ev_ncalls // #define ev_pncalls ev_.ev_signal.ev_pncalls union { /* used for io events */ struct { // 下一個io事件 LIST_ENTRY (event) ev_io_next; // 事件超時時間(既可以是相對時間,也可以是絕對時間) struct timeval ev_timeout; } ev_io; /* used by signal events */ struct { // 下一個訊號 LIST_ENTRY (event) ev_signal_next; // 訊號準備啟用時,呼叫ev_callback的次數 short ev_ncalls; /* Allows deletes in callback */ // 通常指向 ev_ncalls或者NULL short *ev_pncalls; } ev_signal; } ev_; // 事件型別,它可以是以下三種類型,其中io事件和訊號無法同時成立 // io事件: EV_READ,EV_WRITE // 定時事件:EV_TIMEOUT // 訊號:EV_SIGNAL // 以下是輔助選項,可以和任何事件同時成立 // EV_PERSIST,表明是一個永久事件,表示執行完畢不會移除,如不加,則執行完畢之後會自動移除 // EV_ET: 邊沿觸發,如果後臺方法可用的話,就可以使用;注意區分水平觸發 // EV_FINALIZE:刪除事件時就不會阻塞了,不會等到回撥函式執行完畢;為了在多執行緒中安全使用,需要使用 // event_finalize()或者event_free_finalize() // EV_CLOSED: 可以自動監測關閉的連線,然後放棄讀取未完的資料,但是不是所有後臺方法都支援這個選項 short ev_events; // 記錄當前啟用事件的型別 short ev_res; /* result passed to event callback */ // 儲存事件的超時時間 struct timeval ev_timeout; };