libuv 타이머 분석
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 는 매우 간단 한 모듈 입 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
다양한 언어의 JSONJSON은 Javascript 표기법을 사용하여 데이터 구조를 레이아웃하는 데이터 형식입니다. 그러나 Javascript가 코드에서 이러한 구조를 나타낼 수 있는 유일한 언어는 아닙니다. 저는 일반적으로 '객체'{}...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.