23 #ifdef GRPC_WINSOCK_SOCKET
33 #define GRPC_POLLSET_KICK_BROADCAST ((grpc_pollset_worker*)1)
41 static void pollset_global_init(
void) {
43 g_active_poller = NULL;
44 g_global_root_worker.links[GRPC_POLLSET_WORKER_LINK_GLOBAL].next =
45 g_global_root_worker.links[GRPC_POLLSET_WORKER_LINK_GLOBAL].prev =
46 &g_global_root_worker;
49 static void pollset_global_shutdown(
void) {
gpr_mu_destroy(&grpc_polling_mu); }
52 grpc_pollset_worker_link_type
type) {
59 grpc_pollset_worker_link_type
type) {
67 remove_worker(w,
type);
75 grpc_pollset_worker_link_type
type,
83 static size_t pollset_size(
void) {
return sizeof(
grpc_pollset); }
91 *
mu = &grpc_polling_mu;
92 pollset->root_worker.links[GRPC_POLLSET_WORKER_LINK_POLLSET].next =
93 pollset->root_worker.links[GRPC_POLLSET_WORKER_LINK_POLLSET].prev =
94 &pollset->root_worker;
98 pollset->shutting_down = 1;
100 if (!pollset->is_iocp_worker) {
103 pollset->on_shutdown =
closure;
113 if (worker_hdl) *worker_hdl = &
worker;
115 int added_worker = 0;
116 worker.links[GRPC_POLLSET_WORKER_LINK_POLLSET].next =
117 worker.links[GRPC_POLLSET_WORKER_LINK_POLLSET].prev =
118 worker.links[GRPC_POLLSET_WORKER_LINK_GLOBAL].next =
119 worker.links[GRPC_POLLSET_WORKER_LINK_GLOBAL].prev = NULL;
123 if (!pollset->kicked_without_pollers && !pollset->shutting_down) {
124 if (g_active_poller == NULL) {
127 pollset->is_iocp_worker = 1;
128 g_active_poller = &
worker;
130 grpc_iocp_work(deadline);
133 pollset->is_iocp_worker = 0;
134 g_active_poller = NULL;
136 next_worker = pop_front_worker(&pollset->root_worker,
137 GRPC_POLLSET_WORKER_LINK_POLLSET);
138 if (next_worker == NULL) {
140 next_worker = pop_front_worker(&g_global_root_worker,
141 GRPC_POLLSET_WORKER_LINK_GLOBAL);
143 if (next_worker != NULL) {
144 next_worker->kicked = 1;
148 if (pollset->shutting_down && pollset->on_shutdown != NULL) {
151 pollset->on_shutdown = NULL;
155 push_front_worker(&g_global_root_worker, GRPC_POLLSET_WORKER_LINK_GLOBAL,
157 push_front_worker(&pollset->root_worker, GRPC_POLLSET_WORKER_LINK_POLLSET,
169 pollset->kicked_without_pollers = 0;
178 remove_worker(&
worker, GRPC_POLLSET_WORKER_LINK_GLOBAL);
179 remove_worker(&
worker, GRPC_POLLSET_WORKER_LINK_POLLSET);
182 if (worker_hdl) *worker_hdl = NULL;
188 bool should_kick_global =
false;
189 if (specific_worker != NULL) {
190 if (specific_worker == GRPC_POLLSET_KICK_BROADCAST) {
191 should_kick_global =
true;
192 for (specific_worker =
193 p->root_worker.links[GRPC_POLLSET_WORKER_LINK_POLLSET].next;
194 specific_worker != &
p->root_worker;
196 specific_worker->links[GRPC_POLLSET_WORKER_LINK_POLLSET].next) {
197 specific_worker->kicked = 1;
198 should_kick_global =
false;
201 p->kicked_without_pollers = 1;
202 if (
p->is_iocp_worker) {
204 should_kick_global =
false;
207 if (
p->is_iocp_worker && g_active_poller == specific_worker) {
210 specific_worker->kicked = 1;
216 pop_front_worker(&
p->root_worker, GRPC_POLLSET_WORKER_LINK_POLLSET);
217 if (specific_worker != NULL) {
219 }
else if (
p->is_iocp_worker) {
222 p->kicked_without_pollers = 1;
223 should_kick_global =
true;
226 if (should_kick_global && g_active_poller == NULL) {
228 &g_global_root_worker, GRPC_POLLSET_WORKER_LINK_GLOBAL);
229 if (next_global_worker != NULL) {
230 next_global_worker->kicked = 1;
238 pollset_global_init, pollset_global_shutdown,