|  | @@ -72,6 +72,7 @@ struct grpc_combiner {
 | 
	
		
			
				|  |  |    bool final_list_covered_by_poller;
 | 
	
		
			
				|  |  |    grpc_closure_list final_list;
 | 
	
		
			
				|  |  |    grpc_closure offload;
 | 
	
		
			
				|  |  | +  gpr_refcount refs;
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  static void combiner_exec_uncovered(grpc_exec_ctx *exec_ctx,
 | 
	
	
		
			
				|  | @@ -126,6 +127,7 @@ static bool is_covered_by_poller(grpc_combiner *lock) {
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  grpc_combiner *grpc_combiner_create(grpc_workqueue *optional_workqueue) {
 | 
	
		
			
				|  |  |    grpc_combiner *lock = gpr_malloc(sizeof(*lock));
 | 
	
		
			
				|  |  | +  gpr_ref_init(&lock->refs, 1);
 | 
	
		
			
				|  |  |    lock->next_combiner_on_this_exec_ctx = NULL;
 | 
	
		
			
				|  |  |    lock->time_to_execute_final_list = false;
 | 
	
		
			
				|  |  |    lock->optional_workqueue = optional_workqueue;
 | 
	
	
		
			
				|  | @@ -152,7 +154,7 @@ static void really_destroy(grpc_exec_ctx *exec_ctx, grpc_combiner *lock) {
 | 
	
		
			
				|  |  |    gpr_free(lock);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -void grpc_combiner_destroy(grpc_exec_ctx *exec_ctx, grpc_combiner *lock) {
 | 
	
		
			
				|  |  | +static void start_destroy(grpc_exec_ctx *exec_ctx, grpc_combiner *lock) {
 | 
	
		
			
				|  |  |    gpr_atm old_state = gpr_atm_full_fetch_add(&lock->state, -STATE_UNORPHANED);
 | 
	
		
			
				|  |  |    GRPC_COMBINER_TRACE(gpr_log(
 | 
	
		
			
				|  |  |        GPR_DEBUG, "C:%p really_destroy old_state=%" PRIdPTR, lock, old_state));
 | 
	
	
		
			
				|  | @@ -161,6 +163,14 @@ void grpc_combiner_destroy(grpc_exec_ctx *exec_ctx, grpc_combiner *lock) {
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +void grpc_combiner_unref(grpc_exec_ctx *exec_ctx, grpc_combiner *lock) {
 | 
	
		
			
				|  |  | +  if (gpr_unref(&lock->refs)) {
 | 
	
		
			
				|  |  | +    start_destroy(exec_ctx, lock);
 | 
	
		
			
				|  |  | +  }
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +void grpc_combiner_ref(grpc_combiner *lock) { gpr_ref(&lock->refs); }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  static void push_last_on_exec_ctx(grpc_exec_ctx *exec_ctx,
 | 
	
		
			
				|  |  |                                    grpc_combiner *lock) {
 | 
	
		
			
				|  |  |    lock->next_combiner_on_this_exec_ctx = NULL;
 |