1. 程式人生 > >libevent原始碼分析(2)--2.1.8--結構體 struct event和struct event_callback

libevent原始碼分析(2)--2.1.8--結構體 struct event和struct event_callback

一、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;
};