Libevent原始碼分析-----開篇
我所分析的Libevent版本是2.0.21版本,是目前最新的穩定版本。看這系列博文中,需要讀者有Linux程式設計的一些基礎。因為像POSIX、檔案描述符、多執行緒等等這些概念,我並不會去解釋,我預設讀者已經熟悉這些概念了。如果讀者讀過《UNIX環境高階程式設計》,那就完全沒問題了。
因為Libevent是跨平臺的,所以它使用了很多它自己定義的通用跨平臺型別,比如evutil_socket_t。此外,Libevent也定義了一些跨平臺通用的API,這些都可以在《通用型別和函式》一文中找到。
相信來看本系列的文章的讀者,都不會是剛剛接觸Libevent的使用者。這裡就不說Libevent的優點和怎麼安裝使用Libevent了。我是想介紹其他東西。
Source Insight:
這個工具是閱讀程式碼的神器。下面是一個截圖。
正中央是程式碼視窗。在程式碼中,如果你想看一下event_assign函式的內部是怎麼實現的,那麼你不用找到event_assign函式實現檔案,然後開啟,再Ctrl + F查詢。在Source Insight中,你只需用滑鼠單擊一下event_assign函式。那麼就會在下面的那個視窗顯示event_assign函式的具體實現。是不是很厲害的功能?
右邊的視窗是檔案列表,和其他IDE的功能差不多。
左邊那個視窗功能也是很強大的,特殊是當代碼中出現了很多條件巨集。在這樣的條件下,這個巨集會被定義成這樣。在那樣的條件下,又會定義成那樣。左邊的視窗可以清楚地看到。
Doxgen工具:
這是一個可以製作chm檔案的工具。
在Source Insight中,雖然是很容易追蹤到某個函式的具體實現(實現都在c檔案中,非標頭檔案)。但Libevent的原始檔中很少有註釋,也沒有這個函式的解釋。而且Source Insight無法追蹤到函式的宣告,只能追蹤到定義(就是函式的實現)(或許是我對Source Insight還不熟悉,如果有這樣的功能,還望大家指出)。
而由Doxgen工具生成的chm檔案是離線把的幫助文件,它會列出函式的說明、引數和返回值。
do{}while(0)巨集:
函式呼叫關係圖:
有時候追蹤一個函式,想知道該函式的呼叫關係圖。有一個網站提供了這個關係圖。下面舉兩個例子。
圖中,上面的是event_free函式會呼叫哪些函式,一顆主呼叫樹。下面的是哪些函式會呼叫event_free函式,是被呼叫關係。其中test_event_pending這些是Libevent提供的測試例子的測試函式。下面再給另外一個被呼叫關係的圖:
有一個不足之處,這個網站並沒有和Libevent同步更新,目前提供的最高Libevent版本是2.0.3-alpha