由於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。
具體例子,佔坑待補。