|
|
|
@ -83,6 +83,7 @@ static gpr_timespec compute_min_deadline(shard_type *shard) { |
|
|
|
|
void grpc_timer_list_init(gpr_timespec now) { |
|
|
|
|
uint32_t i; |
|
|
|
|
|
|
|
|
|
g_initialized = true; |
|
|
|
|
gpr_mu_init(&g_mu); |
|
|
|
|
gpr_mu_init(&g_checker_mu); |
|
|
|
|
g_clock_type = now.clock_type; |
|
|
|
@ -111,6 +112,7 @@ void grpc_timer_list_shutdown(grpc_exec_ctx *exec_ctx) { |
|
|
|
|
} |
|
|
|
|
gpr_mu_destroy(&g_mu); |
|
|
|
|
gpr_mu_destroy(&g_checker_mu); |
|
|
|
|
g_initialized = false; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* This is a cheap, but good enough, pointer hash for sharding the tasks: */ |
|
|
|
@ -180,6 +182,16 @@ void grpc_timer_init(grpc_exec_ctx *exec_ctx, grpc_timer *timer, |
|
|
|
|
timer->deadline = deadline; |
|
|
|
|
timer->triggered = 0; |
|
|
|
|
|
|
|
|
|
if (!g_initialized) { |
|
|
|
|
grpc_exec_ctx_enqueue(exec_ctx, &timer->closure, false); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (gpr_time_cmp(deadline, now) <= 0) { |
|
|
|
|
grpc_exec_ctx_enqueue(exec_ctx, &timer->closure, true); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
/* TODO(ctiller): check deadline expired */ |
|
|
|
|
|
|
|
|
|
gpr_mu_lock(&shard->mu); |
|
|
|
|