boost::asio epoll_reactor 源碼分析

asio 的菁華可以從 epoll reactor 開始看起。
epoll_reactor.hpp
epoll_reactor.ipp

有寫過 epoll 代碼的都知道 epoll_create(), epoll_ctl(), epoll_wait() 這幾個關鍵的 API, 可以從代碼去循跡大神是怎麼封裝這些東西的。

再來一個蠻重要的,通常這種反應爐事件驅動模型是怎麼中斷就結束的,為什麼這樣說呢?因為這種等待是 Block 的,沒有東西進來是不會從 epoll_wait() 返回的,

以下簡碼為 epoll_reactor.ipp 裡幾個 epoll api 轉接處

epoll_reactor.ipp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
epoll_reactor::epoll_reactor()
: epoll_fd_(do_epoll_create()) {
...
epoll_ctl(epoll_fd_, EPOLL_CTL_ADD, interrupter_.read_descriptor(), &ev);
}

void epoll_reactor::run(...) {
...
epoll_wait(epoll_fd_, events, 128, timeout);
}

void epoll_reactor::interrupt() {
...
epoll_ctl(epoll_fd_, EPOLL_CTL_MOD, interrupter_.read_descriptor(), &ev);
}

int epoll_reactor::do_epoll_create() {
...
fd = epoll_create(epoll_size);
return fd;
}

epoll_reactor.ipp 簡碼下載


未完…
Code 簡碼
UML 類別關係圖