diff --git a/src/core/lib/iomgr/pollset_windows.cc b/src/core/lib/iomgr/pollset_windows.cc index cdc0c1dc628..aa21fd4bf42 100644 --- a/src/core/lib/iomgr/pollset_windows.cc +++ b/src/core/lib/iomgr/pollset_windows.cc @@ -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;