|
|
@ -71,7 +71,8 @@ static DWORD deadline_to_millis_timeout(gpr_timespec deadline, |
|
|
|
timeout, gpr_time_from_nanos(GPR_NS_PER_MS - 1, GPR_TIMESPAN))); |
|
|
|
timeout, gpr_time_from_nanos(GPR_NS_PER_MS - 1, GPR_TIMESPAN))); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void grpc_iocp_work(grpc_exec_ctx *exec_ctx, gpr_timespec deadline) { |
|
|
|
grpc_iocp_work_status grpc_iocp_work(grpc_exec_ctx *exec_ctx, |
|
|
|
|
|
|
|
gpr_timespec deadline) { |
|
|
|
BOOL success; |
|
|
|
BOOL success; |
|
|
|
DWORD bytes = 0; |
|
|
|
DWORD bytes = 0; |
|
|
|
DWORD flags = 0; |
|
|
|
DWORD flags = 0; |
|
|
@ -84,14 +85,14 @@ void grpc_iocp_work(grpc_exec_ctx *exec_ctx, gpr_timespec deadline) { |
|
|
|
g_iocp, &bytes, &completion_key, &overlapped, |
|
|
|
g_iocp, &bytes, &completion_key, &overlapped, |
|
|
|
deadline_to_millis_timeout(deadline, gpr_now(deadline.clock_type))); |
|
|
|
deadline_to_millis_timeout(deadline, gpr_now(deadline.clock_type))); |
|
|
|
if (success == 0 && overlapped == NULL) { |
|
|
|
if (success == 0 && overlapped == NULL) { |
|
|
|
return; |
|
|
|
return GRPC_IOCP_WORK_TIMEOUT; |
|
|
|
} |
|
|
|
} |
|
|
|
GPR_ASSERT(completion_key && overlapped); |
|
|
|
GPR_ASSERT(completion_key && overlapped); |
|
|
|
if (overlapped == &g_iocp_custom_overlap) { |
|
|
|
if (overlapped == &g_iocp_custom_overlap) { |
|
|
|
gpr_atm_full_fetch_add(&g_custom_events, -1); |
|
|
|
gpr_atm_full_fetch_add(&g_custom_events, -1); |
|
|
|
if (completion_key == (ULONG_PTR)&g_iocp_kick_token) { |
|
|
|
if (completion_key == (ULONG_PTR)&g_iocp_kick_token) { |
|
|
|
/* We were awoken from a kick. */ |
|
|
|
/* We were awoken from a kick. */ |
|
|
|
return; |
|
|
|
return GRPC_IOCP_WORK_KICK; |
|
|
|
} |
|
|
|
} |
|
|
|
gpr_log(GPR_ERROR, "Unknown custom completion key."); |
|
|
|
gpr_log(GPR_ERROR, "Unknown custom completion key."); |
|
|
|
abort(); |
|
|
|
abort(); |
|
|
@ -121,6 +122,7 @@ void grpc_iocp_work(grpc_exec_ctx *exec_ctx, gpr_timespec deadline) { |
|
|
|
} |
|
|
|
} |
|
|
|
gpr_mu_unlock(&socket->state_mu); |
|
|
|
gpr_mu_unlock(&socket->state_mu); |
|
|
|
grpc_exec_ctx_enqueue(exec_ctx, closure, true, NULL); |
|
|
|
grpc_exec_ctx_enqueue(exec_ctx, closure, true, NULL); |
|
|
|
|
|
|
|
return GRPC_IOCP_WORK_WORK; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void grpc_iocp_init(void) { |
|
|
|
void grpc_iocp_init(void) { |
|
|
@ -140,10 +142,12 @@ void grpc_iocp_kick(void) { |
|
|
|
|
|
|
|
|
|
|
|
void grpc_iocp_flush(void) { |
|
|
|
void grpc_iocp_flush(void) { |
|
|
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; |
|
|
|
grpc_exec_ctx exec_ctx = GRPC_EXEC_CTX_INIT; |
|
|
|
|
|
|
|
grpc_iocp_work_status work_status; |
|
|
|
|
|
|
|
|
|
|
|
do { |
|
|
|
do { |
|
|
|
grpc_iocp_work(&exec_ctx, gpr_inf_past(GPR_CLOCK_MONOTONIC)); |
|
|
|
work_status = grpc_iocp_work(&exec_ctx, gpr_inf_past(GPR_CLOCK_MONOTONIC)); |
|
|
|
} while (grpc_exec_ctx_flush(&exec_ctx)); |
|
|
|
} while (work_status == GRPC_IOCP_WORK_KICK || |
|
|
|
|
|
|
|
grpc_exec_ctx_flush(&exec_ctx)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
void grpc_iocp_shutdown(void) { |
|
|
|
void grpc_iocp_shutdown(void) { |
|
|
|