libev原始碼分析(一) 基礎結構體

2021-08-31 11:43:47 字數 3447 閱讀 6252

本篇文章主要分析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...