diff --git a/src/core/lib/iomgr/tcp_posix.c b/src/core/lib/iomgr/tcp_posix.c index 6c56c36bcd2..7e271294fd6 100644 --- a/src/core/lib/iomgr/tcp_posix.c +++ b/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);