libevent學習筆記三 活躍事件管理

2021-09-23 22:33:37 字數 1808 閱讀 8772

建議先看事件管理那篇博文再看這一篇

libevent活躍事件採用雙向鍊錶和指向這些雙向鍊錶的結構體陣列來管理,陣列成員是按優先順序存放的,下標越小優先順序越高,且同一雙向鍊錶中各個節點的優先順序是一樣的,這點需要注意,libevent在結構體struct event_base中維護了指向活躍事件雙向鍊錶的陣列struct evcallback_list *activequeues,變數nactivequeues表示陣列長度,該陣列如下圖:

陣列成員是乙個結構體,該結構體變數的成員為指向了雙向鍊錶的頭和尾的指標,如下圖所示:

該巨集用於宣告乙個指向雙向煉表頭和尾的結構體

#define tailq_head(name, type)						\

struct name

// 該語句宣告了上述陣列成員變數

tailq_head(evcallback_list, event_callback);

該巨集初始化上乙個巨集宣告的變數

#define	tailq_init(head) do  while (0)
該巨集用於宣告雙向鍊錶的節點

#define tailq_entry(type)						\

struct

注意下述結構體入口處使用了巨集tailq_entry,不難看出tailq_entry的成員變數 struct type *tqe_next的位址就是結構體struct event_callback 的首位址,這一點很重要。

struct event_callback ;
雙向鍊錶尾插入操作

// 在這裡head為陣列activequeues的成員變數位址

// elm為event_callback

// field為指向下乙個節點的指標

#define tailq_insert_tail(head, elm, field) do while (0)

雙向鍊錶刪除操作

#define tailq_remove(head, elm, field) do  while (0)
當libevent庫初始化完畢,且相應的event新增到libevent庫中,那麼libevent庫會在該介面event_base_dispatch中進入死迴圈,在其中呼叫相應的dispatch函式來獲取準備好的event事件並插入到活躍鍊錶中,在此以epoll為例進行簡述:

1、在介面epoll_dispatch中通過epoll_wait獲取就緒的檔案描述符

2、將該檔案描述符對應的event插入到活躍列表中,通過下述介面:

void evmap_io_active_(struct event_base *base, evutil_socket_t fd, short events)
在上述介面中呼叫巨集get_io_slot(x,map,slot,type)來獲取對應檔案描述符對應的事件煉表頭,可以參考事件管理章節。然後通過巨集list_foreach遍歷鍊錶,進而呼叫介面event_active_nolock_將滿足的事件插入到活躍事件鍊錶中。

3、呼叫介面event_process_active來處理活躍鍊錶中的事件。

libevent學習筆記 setvbuf 函式

函式名 setvbuf 用 法 int setvbuf file stream,char buf,int type,unsigned size type 期望緩衝區的型別 iofbf 滿緩衝 當緩衝區為空時,從流讀入資料。或者當緩衝區滿時,向流寫入數 據。iolbf 行緩衝 每次從流中讀入一行資料或...

libevent學習筆記之一 Libevent簡介

libevent學習筆記之一 libevent簡介 libevent 是乙個用c語言編寫的 輕量級的開源高效能事件通知庫,主要有以下幾個技術點 事件驅動 event driven 高效能 輕量級,專注於網路,不如同類產品的 ace 那麼臃腫龐大 但源 相當精煉 易讀 現在支援跨平台 可以在 wind...

libevent學習總結

對libevent進行一下簡要的總結,libevent將socket 訊號事件 定時器進行統一管理 libevent首先會檢查操作支援那種型別的多路復用函式,檢查順序為 evport kqueue epoll devpoll poll select。主要研究了一下libevent 對socket的管...