本篇文章主要分析libev中常用到且十分重要的結構。libev的**很簡練,除了對高效i/o模型等的封裝檔案,核心檔案就兩個:ev.h和ev.c,其中ev.c大概4000行左右。**大量用到了巨集,並且巨集還巢狀了巨集,為了便於理解libev的**,這裡對巨集進行了還原。
ev_watcher結構體(其成員為其它結構的公共部分):
typedef struct ev_watcher ev_watcher;
ev_watcher_list結構體:
typedef struct ev_watcher_list ev_watcher_list;
ev_watcher_time 結構體:
typedef struct ev_watcher_time ev_watcher_time;
ev_io結構體:
typedef struct ev_io ev_io;
ev_timer結構體:
typedef struct ev_timer
ev_timer;
ev_periodic結構體:
typedef struct ev_periodic ev_periodic;
ev_periodic在特定的時間呼叫,可能會在定期間隔反覆呼叫,其基於utc時間
(ps:utc:協調時間 也就是從2023年1月1日00:00:00開始記時)觸發事件ev_periodic
ev_signal結構體:
typedef struct ev_signal ev_signal;
ev_signal當接收到指定的訊號時呼叫觸發事件ev_signal
ev_child結構體:
typedef struct ev_child ev_child;
ev_child當接收到sigchld訊號並且waitpid表示了給出的pid時呼叫觸發ev_child事件
其不支援優先順序
ev_stat結構體:
typedef struct ev_stat ev_stat;
ev_stat當每次指定的路徑狀態資料發生改變時呼叫觸發ev_stat
ev_idle結構體:
typedef struct ev_idle ev_idle;
ev_idle當啥事情都不需要做的時候呼叫,用來保持程序遠離阻塞觸發ev_idle
ev_prepare結構體:
typedef struct ev_prepare ev_prepare;
ev_prepare每次執行mainloop主迴圈,在主迴圈之前呼叫觸發ev_prepare
ev_check結構體:
typedef struct ev_check ev_check;
ev_check每次執行mainloop主迴圈,在主迴圈之後呼叫觸發ev_check
ev_fork結構體:
typedef struct ev_fork ev_fork;
ev_fork在fork行為被檢測到,並且在檢測子程序之前呼叫觸發ev_fork
ev_cleanup結構體:
typedef struct ev_cleanup ev_cleanup;
ev_cleanup在主循被銷毀之後呼叫觸發ev_cleanup
ev_embed結構體:
typedef struct ev_embed ev_embed;
ev_embed用於將乙個事件迴圈巢狀到另乙個中,當事件迴圈處理事件的時候被呼叫
ev_async結構體:
typedef struct ev_async ev_async;
ev_async當ev_async_send通過watcher呼叫時呼叫,觸發ev_async
ev_any_watcher結構:
union ev_any_watcher ;
該結構的存在用以強制類似結構的布局
ev_loop結構體(事件迴圈的主體):
struct ev_loop
;
ev_loop的一些成員:
ev_tstamp now_floor;/* last time we refreshed rt_time */
ev_tstamp mn_now;//當前單調時間,系統開機時間
ev_tstamp rtmn_diff;/* difference realtime - monotonic time */
unsigned int origflags;//
int backend;//epoll、kqueue、poll、select、port標記
int activecnt;//啟用事件總數
int backend_fd;//對於epoll,為epoll_create返回的描述符
int * fdchanges;//事件佇列
int fdchangemax;//當前最大事件數
int fdchangecnt;//事件數
anpending *pendings [numpri];//待處理佇列
int pendingmax [numpri];//當前最大等待事件的數量
int pendingcnt [numpri];//記錄每個優先順序的數量
檔案描述符資訊結構
typedef struct anfd;
指定等待事件的監聽者結構
typedef struct anfd;
每個inotify-id對應的雜湊表的每個節點的結構
typedef struct anfs;
堆結構的節點
typedef struct anhe;
OVS原始碼結構分析
下圖是ovs open vswitch 系統層面的邏輯圖。其中datapath是處於系統的核心層 kernel space 我們可以將datapath理解為乙個網橋 linux bridge 處於使用者態 user space 的主要是openvswitch client openflow clie...
shared ptr原始碼結構分析
shared ptr是智慧型指標的一種,相較於unique ptr,引入了引用計數的概念,可以支援多個智慧型指標指向同一資源,由引用計數的增減來描述資源的共享或記憶體釋放,引用計數降為0的時候,資源所占用的記憶體空間會被釋放。觀察其原始碼結構,可以發現shared ptr是乙個模板派生類,ptr b...
基礎資料結構之TreeMap原始碼分析
1.treemap資料結構屬於紅黑樹,紅黑樹是自平衡二叉樹 treemap節點原始碼 static final class entryimplements map.entry 2.向treemap中新增元素 原始碼分析 public v put k key,v value int cmp entry...