|  | @@ -135,23 +135,34 @@ static void run_poller(grpc_exec_ctx *exec_ctx, void *bp,
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p run", p);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    gpr_mu_lock(p->pollset_mu);
 | 
	
		
			
				|  |  | +  gpr_timespec now = gpr_now(GPR_CLOCK_MONOTONIC);
 | 
	
		
			
				|  |  | +  gpr_timespec deadline =
 | 
	
		
			
				|  |  | +      gpr_time_add(now, gpr_time_from_seconds(10, GPR_TIMESPAN));
 | 
	
		
			
				|  |  |    GRPC_LOG_IF_ERROR("backup_poller:pollset_work",
 | 
	
		
			
				|  |  |                      grpc_pollset_work(exec_ctx, BACKUP_POLLER_POLLSET(p), NULL,
 | 
	
		
			
				|  |  | -                                      gpr_now(GPR_CLOCK_MONOTONIC),
 | 
	
		
			
				|  |  | -                                      gpr_inf_future(GPR_CLOCK_MONOTONIC)));
 | 
	
		
			
				|  |  | +                                      now, deadline));
 | 
	
		
			
				|  |  |    gpr_mu_unlock(p->pollset_mu);
 | 
	
		
			
				|  |  | -  if (gpr_atm_no_barrier_load(&g_backup_poller) == (gpr_atm)p) {
 | 
	
		
			
				|  |  | +  /* last "uncovered" notification is the ref that keeps us polling, if we get
 | 
	
		
			
				|  |  | +   * there try a cas to release it */
 | 
	
		
			
				|  |  | +  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);
 | 
	
		
			
				|  |  |      if (GRPC_TRACER_ON(grpc_tcp_trace)) {
 | 
	
		
			
				|  |  | -      gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p reschedule", p);
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p done cas_ok=%d", p, cas_ok);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    GRPC_CLOSURE_SCHED(exec_ctx, &p->run_poller, GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  | -  } else {
 | 
	
		
			
				|  |  | +    gpr_mu_unlock(p->pollset_mu);
 | 
	
		
			
				|  |  |      if (GRPC_TRACER_ON(grpc_tcp_trace)) {
 | 
	
		
			
				|  |  |        gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p shutdown", p);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      grpc_pollset_shutdown(exec_ctx, BACKUP_POLLER_POLLSET(p),
 | 
	
		
			
				|  |  |                            GRPC_CLOSURE_INIT(&p->run_poller, done_poller, p,
 | 
	
		
			
				|  |  |                                              grpc_schedule_on_exec_ctx));
 | 
	
		
			
				|  |  | +  } else {
 | 
	
		
			
				|  |  | +    if (GRPC_TRACER_ON(grpc_tcp_trace)) {
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p reschedule", p);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    GRPC_CLOSURE_SCHED(exec_ctx, &p->run_poller, GRPC_ERROR_NONE);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
	
		
			
				|  | @@ -163,16 +174,7 @@ static void drop_uncovered(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p uncover cnt %d->%d", p, (int)old_count,
 | 
	
		
			
				|  |  |              (int)old_count - 1);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  if (old_count == 1) {
 | 
	
		
			
				|  |  | -    gpr_mu_lock(p->pollset_mu);
 | 
	
		
			
				|  |  | -    bool cas_ok = gpr_atm_no_barrier_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);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -    GRPC_LOG_IF_ERROR("backup_poller:pollset_kick",
 | 
	
		
			
				|  |  | -                      grpc_pollset_kick(BACKUP_POLLER_POLLSET(p), NULL));
 | 
	
		
			
				|  |  | -    gpr_mu_unlock(p->pollset_mu);
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | +  GPR_ASSERT(old_count != 1);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void cover_self(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
 | 
	
	
		
			
				|  | @@ -203,7 +205,9 @@ static void cover_self(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
 | 
	
		
			
				|  |  |      gpr_log(GPR_DEBUG, "BACKUP_POLLER:%p add %p", p, tcp);
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    grpc_pollset_add_fd(exec_ctx, BACKUP_POLLER_POLLSET(p), tcp->em_fd);
 | 
	
		
			
				|  |  | -  drop_uncovered(exec_ctx, tcp);
 | 
	
		
			
				|  |  | +  if (old_count != 0) {
 | 
	
		
			
				|  |  | +    drop_uncovered(exec_ctx, tcp);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void notify_on_read(grpc_exec_ctx *exec_ctx, grpc_tcp *tcp) {
 |