中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何分析libuv中的idle、check、prepare階段

發布時間:2021-12-09 09:26:10 來源:億速云 閱讀:237 作者:柒染 欄目:大數據

這期內容當中小編將會給大家帶來有關如何分析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階段了,如果剛好有類似的疑惑,不妨參照上述分析進行理解。如果想知道更多相關知識,歡迎關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

精河县| 天镇县| 田林县| 南宫市| 漳州市| 定远县| 齐河县| 桦南县| 斗六市| 周口市| 延庆县| 玉山县| 大名县| 永修县| 丰顺县| 太保市| 合肥市| 高唐县| 新丰县| 奇台县| 玉屏| 永吉县| 莱州市| 屯昌县| 庆城县| 西平县| 剑阁县| 偃师市| 宁明县| 广昌县| 建德市| 肇东市| 泸定县| 鄂尔多斯市| 渝中区| 民县| 长丰县| 江陵县| 鞍山市| 峨眉山市| 即墨市|