Fix kicking poller

pull/10932/head
Craig Tiller 8 years ago
parent 7cb2698abd
commit 43bf259f4e
  1. 12
      src/core/lib/iomgr/ev_epoll1_linux.c

@ -96,7 +96,7 @@ static void fd_global_shutdown(void);
* Pollset Declarations
*/
typedef enum { UNKICKED, KICKED, KICKED_FOR_POLL } kick_state;
typedef enum { UNKICKED, KICKED, DESIGNATED_POLLER } kick_state;
struct grpc_pollset_worker {
kick_state kick_state;
@ -572,7 +572,7 @@ static bool begin_worker(grpc_pollset *pollset, grpc_pollset_worker *worker,
if (neighbourhood->seen_inactive) {
neighbourhood->seen_inactive = false;
if (gpr_atm_no_barrier_cas(&g_active_poller, 0, (gpr_atm)worker)) {
worker->kick_state = KICKED_FOR_POLL;
worker->kick_state = DESIGNATED_POLLER;
}
}
}
@ -591,7 +591,7 @@ static bool begin_worker(grpc_pollset *pollset, grpc_pollset_worker *worker,
*now = gpr_now(now->clock_type);
}
return worker->kick_state == KICKED_FOR_POLL &&
return worker->kick_state == DESIGNATED_POLLER &&
pollset->shutdown_closure == NULL;
}
@ -611,7 +611,7 @@ static bool check_neighbourhood_for_available_poller(
if (inspect_worker != NULL) {
if (gpr_atm_no_barrier_cas(&g_active_poller, 0,
(gpr_atm)inspect_worker)) {
inspect_worker->kick_state = KICKED_FOR_POLL;
inspect_worker->kick_state = DESIGNATED_POLLER;
if (inspect_worker->initialized_cv) {
gpr_cv_signal(&inspect_worker->cv);
}
@ -641,7 +641,7 @@ static void end_worker(grpc_exec_ctx *exec_ctx, grpc_pollset *pollset,
if (worker->next != worker) {
assert(worker->next->initialized_cv);
gpr_atm_no_barrier_store(&g_active_poller, (gpr_atm)worker->next);
worker->next->kick_state = KICKED_FOR_POLL;
worker->next->kick_state = DESIGNATED_POLLER;
gpr_cv_signal(&worker->next->cv);
if (grpc_exec_ctx_has_work(exec_ctx)) {
gpr_mu_unlock(&pollset->mu);
@ -746,7 +746,7 @@ static grpc_error *pollset_kick(grpc_pollset *pollset,
} else {
return GRPC_ERROR_NONE;
}
} else if (specific_worker->kick_state != UNKICKED) {
} else if (specific_worker->kick_state == KICKED) {
return GRPC_ERROR_NONE;
} else if (gpr_tls_get(&g_current_thread_worker) ==
(intptr_t)specific_worker) {

Loading…
Cancel
Save