| 
					
				 | 
			
			
				@@ -183,8 +183,11 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   enter_ctx(exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_subchannel *c = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  bool need_to_unref_constructed; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   while (c == NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    need_to_unref_constructed = false; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // Compare and swap loop: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // - take a reference to the current index 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_mu_lock(&g_mu); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -193,9 +196,12 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     // - Check to see if a subchannel already exists 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     c = gpr_avl_get(index, key); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    if (c != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      c = GRPC_SUBCHANNEL_REF_FROM_WEAK_REF(c, "index_register"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (c != NULL) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // yes -> we're done 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      GRPC_SUBCHANNEL_WEAK_UNREF(exec_ctx, constructed, "index_register"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      need_to_unref_constructed = true; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       // no -> update the avl and compare/swap 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       gpr_avl updated = 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -219,6 +225,10 @@ grpc_subchannel *grpc_subchannel_index_register(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   leave_ctx(exec_ctx); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (need_to_unref_constructed) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    GRPC_SUBCHANNEL_UNREF(exec_ctx, constructed, "index_register"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 |