——支援i/o多路復用技術
張亮libevent的核心是事件驅動、同步非阻塞,為了達到這一目標,必須採用系統提供的i/o多路復用技術,而這些在windows、linux、unix等不同平台上卻各有不同,如何能提供優雅而統一的支援方式,是首要關鍵的問題,這其實不難,本節就來分析一下。
libevent支援多種i/o多路復用技術的關鍵就在於結構體eventop,這個結構體前面也曾提到過,它的成員是一系列的函式指標, 定義在event-internal.h檔案中:
[cpp]view plain
copy
struct
eventop ;
在libevent中,每種i/o demultiplex機制的實現都必須提供這五個函式介面,來完成自身的初始化、銷毀釋放;對事件的註冊、登出和分發。
比如對於epoll,libevent實現了5個對應的介面函式,並在初始化時並將eventop的5個函式指標指向這5個函式,那麼程式就可以使用epoll作為i/o demultiplex機制了。
libevent把所有支援的i/o demultiplex機制儲存在乙個全域性靜態陣列eventops中,並在初始化時選擇使用何種機制,陣列內容根據優先順序順序宣告如下:
[cpp]view plain
copy
/* in order of preference */
static
const
struct
eventop *eventops = ;
然後libevent根據系統配置和編譯選項決定使用哪一種i/o demultiplex機制,這段**在函式event_base_new()中:
[cpp]view plain
copy
base->evbase = null;
for(i = 0; eventops[i] && !base->evbase; i++)
可以看出,libevent在編譯階段選擇系統的i/o demultiplex機制,而不支援在執行階段根據配置再次選擇。
以linux下面的epoll為例,實現在原始檔epoll.c中,eventops物件epollops定義如下:
[cpp]view plain
copy
const
struct
eventop epollops = ;
變數epollops中的函式指標具體宣告如下,注意到其返回值和引數都和eventop中的定義嚴格一致,這是函式指標的語法限制。
[cpp]view plain
copy
static
void
*epoll_init (
struct
event_base *);
static
intepoll_add (
void
*, struct
event *);
static
intepoll_del (
void
*, struct
event *);
static
intepoll_dispatch(
struct
event_base *,
void
*, struct
timeval *);
static
void
epoll_dealloc (
struct
event_base *,
void
*);
那麼如果選擇的是epoll,那麼呼叫結構體eventop的init和dispatch函式指標時,實際呼叫的函式就是epoll的初始化函式epoll_init()和事件分發函式epoll_dispatch()了;
c++語言提供了虛函式來實現多型,在c語言中,這是通過函式指標實現的。對於各類函式指標的詳細說明可以參見文章:
同樣的,上面epollops以及epoll的各種函式都直接定義在了epoll.c原始檔中,對外都是不可見的。對於libevent的使用者而言,完全不會知道它們的存在,對epoll的使用也是通過eventop來完成的,達到了資訊隱藏的目的。
支援多種i/o demultiplex機制的方法其實挺簡單的,借助於函式指標就ok了。通過對源**的分析也可以看出,libevent是在編譯階段選擇系統的i/o demultiplex機制的,而不支援在執行階段根據配置再次選擇。
libevent原始碼深度剖析
序幕 張亮上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev pol...
libevent原始碼深度剖析
上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev poll sel...
libevent原始碼深度剖析
序幕 張亮上來當然要先誇獎啦,libevent 有幾個顯著的亮點 事件驅動 event driven 高效能 輕量級,專注於網路,不如ace那麼臃腫龐大 源 相當精煉 易讀 跨平台,支援windows linux bsd和mac os 支援多種i o多路復用技術,epoll poll dev pol...