您好,登錄后才能下訂單哦!
這期內容當中小編將會給大家帶來有關如何分析libuv中的idle、check、prepare階段,文章內容豐富且以專業的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。
idle、check、prepare是libuv事件循環中的三個階段,這三個階段主要是從各自的隊列里拿出任務執行,有各自對應的數據結構。nodejs的setImmediate會使用這些階段。
#include "uv.h"
#include "internal.h"
#define UV_LOOP_WATCHER_DEFINE(name, type)
int uv_##name##_init(uv_loop_t* loop, uv_##name##_t* handle) {
// 初始化handle的類型,所屬loop,打上UV_HANDLE_REF,并且把handle插入loop->handle_queue隊列的隊尾
uv__handle_init(loop, (uv_handle_t*)handle, UV_##type);
handle->name##_cb = NULL;
return 0;
}
int uv_##name##_start(uv_##name##_t* handle, uv_##name##_cb cb) {
// 如果已經執行過start函數則直接返回
if (uv__is_active(handle)) return 0;
if (cb == NULL) return UV_EINVAL;
// 把handle插入loop中相應類型的隊列,loop有prepare,idle和check三個隊列
QUEUE_INSERT_HEAD(&handle->loop->name##_handles, &handle->queue);
// 掛載回調,下一輪循環的時候被執行
handle->name##_cb = cb;
// 設置UV_HANDLE_ACTIVE標記位,并且loop中的handle數加一,init的時候只是把handle掛載到loop,start的時候handle才處于激活態
uv__handle_start(handle);
return 0;
}
int uv_##name##_stop(uv_##name##_t* handle) {
if (!uv__is_active(handle)) return 0;
// 把handle從loop中相應的隊列移除,但是還掛載到handle_queue中
QUEUE_REMOVE(&handle->queue);
// 清除active標記位并且減去loop中handle的active數
uv__handle_stop(handle);
return 0;
}
// 在每一輪循環中執行該函數,執行時機見uv_run
void uv__run_##name(uv_loop_t* loop) {
uv_##name##_t* h;
QUEUE queue;
QUEUE* q;
// 把該類型對應的隊列中所有節點摘下來掛載到queue變量
QUEUE_MOVE(&loop->name##_handles, &queue);
// 遍歷隊列,執行每個節點里面的函數
while (!QUEUE_EMPTY(&queue)) {
// 取下當前待處理的節點
q = QUEUE_HEAD(&queue);
// 取得該節點對應的整個結構體的基地址
h = QUEUE_DATA(q, uv_##name##_t, queue);
// 把該節點移出當前隊列
QUEUE_REMOVE(q);
// 重新插入原來的隊列
QUEUE_INSERT_TAIL(&loop->name##_handles, q);
// 執行回調函數
h->name##_cb(h);
}
}
void uv__##name##_close(uv_##name##_t* handle) {
uv_##name##_stop(handle);
}
UV_LOOP_WATCHER_DEFINE(prepare, PREPARE)
UV_LOOP_WATCHER_DEFINE(check, CHECK)
UV_LOOP_WATCHER_DEFINE(idle, IDLE)
利用宏定義,在預處理階段拓展成三個不同類型,但是處理邏輯一樣的代碼。有三種類型,分別是prepare,check,idle。
上述就是小編為大家分享的如何分析libuv中的idle、check、prepare階段了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。