|  | @@ -201,12 +201,15 @@ grpc_event grpc_completion_queue_next(grpc_completion_queue *cc,
 | 
	
		
			
				|  |  |    return ret;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -static void add_plucker(grpc_completion_queue *cc, void *tag,
 | 
	
		
			
				|  |  | -                        grpc_pollset_worker *worker) {
 | 
	
		
			
				|  |  | -  GPR_ASSERT(cc->num_pluckers != GRPC_MAX_COMPLETION_QUEUE_PLUCKERS);
 | 
	
		
			
				|  |  | +static int add_plucker(grpc_completion_queue *cc, void *tag,
 | 
	
		
			
				|  |  | +                       grpc_pollset_worker *worker) {
 | 
	
		
			
				|  |  | +  if (cc->num_pluckers == GRPC_MAX_COMPLETION_QUEUE_PLUCKERS) {
 | 
	
		
			
				|  |  | +    return 0;
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  |    cc->pluckers[cc->num_pluckers].tag = tag;
 | 
	
		
			
				|  |  |    cc->pluckers[cc->num_pluckers].worker = worker;
 | 
	
		
			
				|  |  |    cc->num_pluckers++;
 | 
	
		
			
				|  |  | +  return 1;
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void del_plucker(grpc_completion_queue *cc, void *tag,
 | 
	
	
		
			
				|  | @@ -259,7 +262,16 @@ grpc_event grpc_completion_queue_pluck(grpc_completion_queue *cc, void *tag,
 | 
	
		
			
				|  |  |        ret.type = GRPC_QUEUE_SHUTDOWN;
 | 
	
		
			
				|  |  |        break;
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | -    add_plucker(cc, tag, &worker);
 | 
	
		
			
				|  |  | +    if (!add_plucker(cc, tag, &worker)) {
 | 
	
		
			
				|  |  | +      gpr_log(GPR_DEBUG, 
 | 
	
		
			
				|  |  | +              "Too many outstanding grpc_completion_queue_pluck calls: maximum is %d".
 | 
	
		
			
				|  |  | +              GRPC_MAX_COMPLETION_QUEUE_PLUCKERS);
 | 
	
		
			
				|  |  | +      gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset));
 | 
	
		
			
				|  |  | +      memset(&ret, 0, sizeof(ret));
 | 
	
		
			
				|  |  | +      /* TODO(ctiller): should we use a different result here */
 | 
	
		
			
				|  |  | +      ret.type = GRPC_QUEUE_TIMEOUT;
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  |      if (!grpc_pollset_work(&cc->pollset, &worker, deadline)) {
 | 
	
		
			
				|  |  |        del_plucker(cc, tag, &worker);
 | 
	
		
			
				|  |  |        gpr_mu_unlock(GRPC_POLLSET_MU(&cc->pollset));
 |