libuv 타이머 분석

2638 단어
Timer handles are used to schedule callbacks to be called in the future.
libuv 의 Timer 모듈 의 실현 은 상대 적 으로 간단 합 니 다. libuv 에 대한 분석 은 Timer 모듈 에서 시작 합 니 다.
데이터 구조
Timer 모듈 의 Handle Type (Timer 인 스 턴 스 로 이해 할 수 있 는 데이터 구조) 은 uv 입 니 다.timer_s, 그 내용 은 다음 과 같다.
struct uv_timer_s {
    UV_HANDLE_FIELDS
    UV_TIMER_PRIVATE_FIELDS
};

#define UV_TIMER_PRIVATE_FIELDS                           
  uv_timer_cb timer_cb;    #timer                                                 
  void* heap_node[3];      #    timer        
  uint64_t timeout;        #timer     ,         timer          
  uint64_t repeat;         #timer                                                     
  uint64_t start_id;

인터페이스
1. uv_timer_init
uv_timer_init 인터페이스의 실현 은 매우 간단 하 다.
# file: timer.c
int uv_timer_init(uv_loop_t* loop, uv_timer_t* handle) {
    uv__handle_init(loop, (uv_handle_t*)handle, UV_TIMER);   [1]
    handle->timer_cb = NULL;
    handle->repeat = 0;
    return 0;
}

코드 [1] 대 uvhandle_t 가 초기 화 되 었 습 니 다.uvhandle_init 매크로 정의.
#define uv__handle_init(loop_, h, type_)                                    
    do {                                                                        
        (h)->loop = (loop_);                                                   
        (h)->type = (type_);                                                  
        (h)->flags = UV__HANDLE_REF;  
        QUEUE_INSERT_TAIL(&(loop_)->handle_queue, &(h)->handle_queue); [1]
        uv__handle_platform_init(h);                                             
    }                                                                           
    while (0)

그 중에서 가장 중요 한 부분 은 h (uv handle t) 를 loop - > handlequue 의 대열 로 갑 니 다.
2. uv_timer_start
uv_timer_start 인터페이스의 주요 임 무 는 uvtimer_t. 이 handler 는 loop 유지 보수 의 최소 더미 에 추가 합 니 다 (timer heap)
int uv_timer_start(uv_timer_t* handle,
               uv_timer_cb cb,
               uint64_t timeout,
               uint64_t repeat) {
    uint64_t clamped_timeout;

    if (cb == NULL)
        return -EINVAL;

    if (uv__is_active(handle))
        uv_timer_stop(handle);
  
     ......
     heap_insert((struct heap*) &handle->loop->timer_heap,
          (struct heap_node*) &handle->heap_node,
          timer_less_than);
     uv__handle_start(handle);

      return 0;
}

3.uv_timer_stop
uv_timer_stop 하 는 일이 더 쉬 워 졌 습 니 다. 그 는 Timer 에서 timer힙 에서 handler 를 삭제 하고 닫 습 니 다.
작은 매듭
libuv 안에 Timer 는 매우 간단 한 모듈 입 니 다.

좋은 웹페이지 즐겨찾기