|
|
|
@ -185,19 +185,23 @@ done: |
|
|
|
|
|
|
|
|
|
static grpc_error* pollset_kick(grpc_pollset* p, |
|
|
|
|
grpc_pollset_worker* specific_worker) { |
|
|
|
|
bool should_kick_global = false; |
|
|
|
|
if (specific_worker != NULL) { |
|
|
|
|
if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) { |
|
|
|
|
should_kick_global = true; |
|
|
|
|
for (specific_worker = |
|
|
|
|
p->root_worker.links[GRPC_POLLSET_WORKER_LINK_POLLSET].next; |
|
|
|
|
specific_worker != &p->root_worker; |
|
|
|
|
specific_worker = |
|
|
|
|
specific_worker->links[GRPC_POLLSET_WORKER_LINK_POLLSET].next) { |
|
|
|
|
specific_worker->kicked = 1; |
|
|
|
|
should_kick_global = false; |
|
|
|
|
gpr_cv_signal(&specific_worker->cv); |
|
|
|
|
} |
|
|
|
|
p->kicked_without_pollers = 1; |
|
|
|
|
if (p->is_iocp_worker) { |
|
|
|
|
grpc_iocp_kick(); |
|
|
|
|
should_kick_global = false; |
|
|
|
|
} |
|
|
|
|
} else { |
|
|
|
|
if (p->is_iocp_worker && g_active_poller == specific_worker) { |
|
|
|
@ -216,6 +220,16 @@ static grpc_error* pollset_kick(grpc_pollset* p, |
|
|
|
|
grpc_iocp_kick(); |
|
|
|
|
} else { |
|
|
|
|
p->kicked_without_pollers = 1; |
|
|
|
|
should_kick_global = true; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (should_kick_global && g_active_poller == NULL) { |
|
|
|
|
grpc_pollset_worker* next_global_worker = |
|
|
|
|
pop_front_worker(&g_global_root_worker, |
|
|
|
|
GRPC_POLLSET_WORKER_LINK_GLOBAL); |
|
|
|
|
if (next_global_worker != NULL) { |
|
|
|
|
next_global_worker->kicked = 1; |
|
|
|
|
gpr_cv_signal(&next_global_worker->cv); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
return GRPC_ERROR_NONE; |
|
|
|
|