|  | @@ -372,12 +372,24 @@ static void init_call_elem(grpc_call_element *elem,
 | 
	
		
			
				|  |  |  /* Destructor for call_data */
 | 
	
		
			
				|  |  |  static void destroy_call_elem(grpc_call_element *elem) {
 | 
	
		
			
				|  |  |    call_data *calld = elem->call_data;
 | 
	
		
			
				|  |  | +  channel_data *chand = elem->channel_data;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |    /* if the call got activated, we need to destroy the child stack also, and
 | 
	
		
			
				|  |  |       remove it from the in-flight requests tracked by the child_entry we
 | 
	
		
			
				|  |  |       picked */
 | 
	
		
			
				|  |  | -  if (calld->state == CALL_ACTIVE) {
 | 
	
		
			
				|  |  | -    grpc_child_call_destroy(calld->s.active.child_call);
 | 
	
		
			
				|  |  | +  gpr_mu_lock(&chand->mu);
 | 
	
		
			
				|  |  | +  switch (calld->state) {
 | 
	
		
			
				|  |  | +    case CALL_ACTIVE:
 | 
	
		
			
				|  |  | +      gpr_mu_unlock(&chand->mu);
 | 
	
		
			
				|  |  | +      grpc_child_call_destroy(calld->s.active.child_call);
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +    case CALL_WAITING:
 | 
	
		
			
				|  |  | +      remove_waiting_child(chand, calld);
 | 
	
		
			
				|  |  | +      gpr_mu_unlock(&chand->mu);
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  | +    default:
 | 
	
		
			
				|  |  | +      gpr_mu_unlock(&chand->mu);
 | 
	
		
			
				|  |  | +      break;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    GPR_ASSERT(calld->state != CALL_WAITING);
 | 
	
		
			
				|  |  |  }
 |