routine函數和結構體整理總結 libco源碼分析、學習筆記

博客一級目錄

二級目錄——libco源碼分析/學習筆記

由於routine代碼分成了好幾篇博客分析,然後現在在宏觀上對函數和結構上進行小小的總結和整理。

一、常用的函數接口

以下函數是最上層的函數(供平時編程調用的函數)

int co_create( stCoRoutine_t **ppco,const stCoRoutineAttr_t *attr,pfn_co_routine_t pfn,void *arg );

創建一個協程,申請、初始化協程控制塊;並負責協程環境的初始化。

參數1:協程控制塊(結構體)指針的指針。

參數2:share stack(我認爲是內存池),可以寫NULL表示不使用share stack。

參數3:函數指針:typedef void *(*pfn_co_routine_t)( void * );

參數4:參數3表示的函數的參數。void*類型。

返回值:始終返回0。

注意:主協程不需要create(由操作系統創建),也不需要resume(由操作系統賦予執行權),更不需要yield(return或exit)。一旦create了其它協程,它就會被create自動初始化。

void co_resume( stCoRoutine_t *co );

執行一個協程(交換執行權限,執行co,阻塞當前協程)。如果co是第一次執行會自動提前初始化上下文。

參數1:協程控制塊指針。表示要執行的協程。

void co_yield_ct();

用於子協程主動交出執行權。

void co_yield( stCoRoutine_t *co);

剝奪co所在線程正在執行的協程的執行權。這裏與void co_yield_ct();不一樣的是:剝奪其它協程的執行權。這就允許協程時間片管理了(雖然可能用不到)。

void co_enable_hook_sys();

函數是用來打開 libco 的鉤子標示,進行系統 io 函數的時候纔會調用到 libco 的函數而不是原系統函數

int co_poll( stCoEpoll_t *ctx,struct pollfd fds[], nfds_t nfds, int timeout_ms );

下面這個函數功能相同(只是最後兩個參數順序不同),co_poll直接調用並返回co_poll_inner的返回值。

int co_poll_inner( stCoEpoll_t *ctx,struct pollfd fds[], nfds_t nfds, int timeout, poll_pfn_t pollfunc);

我們對co_poll_inner進行解釋:

功能:相當於epoll。要使co_poll工作必須在主協程中調用eventloop,否則無法檢查事件超時。

參數1:eventloop控制塊指針。因爲poll要跟eventloop搭配。

參數2:監聽的句柄數組,struct pollfd是Linux  poll用到的數據結構。

參數3:用於標記數組fds中的結構體元素的總數量。

參數4:函數指針,超時(active)事件。定義如下:

typedef int (*poll_pfn_t)(struct pollfd fds[], nfds_t nfds, int timeout);

參數5:超時時間ms,若此參數不爲空,則此時間不僅僅被加入到epoll中監聽,還會被加入到事件輪中等待超時同樣會轉爲active。

具體例子,佔坑待補。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章