Fix race conditions on backup poller creation

pull/11758/head
Craig Tiller 8 years ago
parent 83cf88c85e
commit 8e71287bd7
  1. 11
      src/core/lib/iomgr/tcp_posix.c

@ -148,7 +148,7 @@ static void run_poller(grpc_exec_ctx *exec_ctx, void *bp,
if (gpr_atm_no_barrier_load(&g_uncovered_notifications_pending) == 1 &&
gpr_atm_full_cas(&g_uncovered_notifications_pending, 1, 0)) {
gpr_mu_lock(p->pollset_mu);
bool cas_ok = gpr_atm_no_barrier_cas(&g_backup_poller, (gpr_atm)p, 0);
bool cas_ok = gpr_atm_full_cas(&g_backup_poller, (gpr_atm)p, 0);
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p done cas_ok=%d", p, cas_ok);
}
@ -168,7 +168,7 @@ static void run_poller(grpc_exec_ctx *exec_ctx, void *bp,
}
static void drop_uncovered(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
backup_poller *p = (backup_poller *)gpr_atm_no_barrier_load(&g_backup_poller);
backup_poller *p = (backup_poller *)gpr_atm_acq_load(&g_backup_poller);
gpr_atm old_count =
gpr_atm_no_barrier_fetch_add(&g_uncovered_notifications_pending, -1);
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
@ -193,15 +193,16 @@ static void cover_self(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p create", p);
}
grpc_pollset_init(BACKUP_POLLER_POLLSET(p), &p->pollset_mu);
gpr_atm_no_barrier_store(&g_backup_poller, (gpr_atm)p);
gpr_atm_rel_store(&g_backup_poller, (gpr_atm)p);
GRPC_CLOSURE_SCHED(
exec_ctx,
GRPC_CLOSURE_INIT(&p->run_poller, run_poller, p,
grpc_executor_scheduler(GRPC_EXECUTOR_LONG)),
GRPC_ERROR_NONE);
} else {
p = (backup_poller *)gpr_atm_no_barrier_load(&g_backup_poller);
GPR_ASSERT(p != NULL);
while ((p = (backup_poller *)gpr_atm_acq_load(&g_backup_poller)) == NULL) {
// spin waiting for backup poller
}
}
if (GRPC_TRACER_ON(grpc_tcp_trace)) {
gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p add %p", p, tcp);

Loading…
Cancel
Save