| 
					
				 | 
			
			
				@@ -52,8 +52,9 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define GRPC_SUBCHANNEL_RECONNECT_MAX_BACKOFF_SECONDS 120 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define GRPC_SUBCHANNEL_RECONNECT_JITTER 0.2 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#define GET_CONNECTED_SUBCHANNEL(subchannel, barrier) \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  ((grpc_connected_subchannel *)(gpr_atm_##barrier##_load(&(subchannel)->connected_subchannel))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+#define GET_CONNECTED_SUBCHANNEL(subchannel, barrier)      \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  ((grpc_connected_subchannel *)(gpr_atm_##barrier##_load( \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      &(subchannel)->connected_subchannel))) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 struct grpc_connected_subchannel { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /** refcount */ 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -152,10 +153,10 @@ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *subchannel, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define REF_PASS_REASON , reason 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define REF_LOG(name, p)                                                  \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "%s: %p   ref %d -> %d %s", \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          (name), (p), (p)->refs, (p)->refs + 1, reason) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          (name), (p), (p)->refs.count, (p)->refs.count + 1, reason) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define UNREF_LOG(name, p)                                                \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_log(file, line, GPR_LOG_SEVERITY_DEBUG, "%s: %p unref %d -> %d %s", \ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-          (name), (p), (p)->refs, (p)->refs - 1, reason) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          (name), (p), (p)->refs.count, (p)->refs.count - 1, reason) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #else 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define SUBCHANNEL_REF_LOCKED(p, r) subchannel_ref_locked((p)) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define SUBCHANNEL_UNREF_LOCKED(p, r) subchannel_unref_locked((p)) 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -175,23 +176,26 @@ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *subchannel, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * connection implementation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void connection_destroy(grpc_exec_ctx *exec_ctx, void *arg, int success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void connection_destroy(grpc_exec_ctx *exec_ctx, void *arg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               int success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_connected_subchannel *c = arg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_stack_destroy(exec_ctx, CHANNEL_STACK_FROM_CONNECTION(c)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_free(c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_connected_subchannel_ref(grpc_connected_subchannel *c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                      GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_connected_subchannel_ref( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_connected_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   REF_LOG("CONNECTION", c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_ref(&c->refs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_connected_subchannel_unref( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_connected_subchannel_unref(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                     grpc_connected_subchannel *c 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                         GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   UNREF_LOG("CONNECTION", c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (gpr_unref(&c->refs)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_exec_ctx_enqueue(exec_ctx, grpc_closure_create(connection_destroy, c), 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_exec_ctx_enqueue(exec_ctx, grpc_closure_create(connection_destroy, c), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -199,7 +203,8 @@ void grpc_connected_subchannel_unref( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  * grpc_subchannel implementation 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void subchannel_destroy(grpc_exec_ctx *exec_ctx, void *arg, int success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void subchannel_destroy(grpc_exec_ctx *exec_ctx, void *arg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                               int success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_subchannel *c = arg; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_connected_subchannel *con = GET_CONNECTED_SUBCHANNEL(c, no_barrier); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (con != NULL) { 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -214,13 +219,16 @@ static void subchannel_destroy(grpc_exec_ctx *exec_ctx, void *arg, int success) 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_subchannel_ref(grpc_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  REF_LOG("SUBCHANNEL", c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_ref(&c->refs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_subchannel_unref(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                            grpc_subchannel *c GRPC_SUBCHANNEL_REF_EXTRA_ARGS) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  UNREF_LOG("SUBCHANNEL", c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (gpr_unref(&c->refs)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_exec_ctx_enqueue(exec_ctx, grpc_closure_create(subchannel_destroy, c), 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_exec_ctx_enqueue(exec_ctx, grpc_closure_create(subchannel_destroy, c), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                          1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -276,7 +284,8 @@ static void continue_connect(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   args.deadline = compute_connect_deadline(c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   args.channel_args = c->args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_CONNECTING, "state_change"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_connectivity_state_set(exec_ctx, &c->state_tracker, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              GRPC_CHANNEL_CONNECTING, "state_change"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_connector_connect(exec_ctx, c->connector, &args, &c->connecting_result, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                          &c->connected); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -319,11 +328,11 @@ void grpc_subchannel_notify_on_state_change(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 void grpc_subchannel_state_change_unsubscribe(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                             grpc_subchannel *c, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                             grpc_closure *subscribed_notify) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              grpc_subchannel *c, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              grpc_closure *subscribed_notify) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu_lock(&c->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_connectivity_state_change_unsubscribe( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      exec_ctx, &c->state_tracker, subscribed_notify); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_connectivity_state_change_unsubscribe(exec_ctx, &c->state_tracker, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                             subscribed_notify); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu_unlock(&c->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -339,7 +348,8 @@ void grpc_subchannel_process_transport_op(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (op->disconnect) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     c->disconnected = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_FATAL_FAILURE, "disconnect"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_connectivity_state_set(exec_ctx, &c->state_tracker, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                GRPC_CHANNEL_FATAL_FAILURE, "disconnect"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (c->have_alarm) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       cancel_alarm = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -360,15 +370,16 @@ void grpc_subchannel_process_transport_op(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_connected_subchannel_process_transport_op(grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, grpc_transport_op *op) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_connected_subchannel_process_transport_op( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_transport_op *op) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_stack *channel_stack = CHANNEL_STACK_FROM_CONNECTION(con); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_channel_element *top_elem = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_channel_stack_element(channel_stack, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_channel_element *top_elem = grpc_channel_stack_element(channel_stack, 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   top_elem->filter->start_transport_op(exec_ctx, top_elem, op); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static void subchannel_on_child_state_changed(grpc_exec_ctx *exec_ctx, void *p, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                             int iomgr_success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                              int iomgr_success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   state_watcher *sw = p; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_subchannel *c = sw->whom.subchannel; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu *mu = &c->mu; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -377,9 +388,12 @@ static void subchannel_on_child_state_changed(grpc_exec_ctx *exec_ctx, void *p, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* if we failed just leave this closure */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (iomgr_success) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_connectivity_state_set(exec_ctx, &c->state_tracker, sw->connectivity_state, "reflect_child"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_connectivity_state_set(exec_ctx, &c->state_tracker, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                sw->connectivity_state, "reflect_child"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     if (sw->connectivity_state != GRPC_CHANNEL_FATAL_FAILURE) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_connected_subchannel_notify_on_state_change(exec_ctx, GET_CONNECTED_SUBCHANNEL(c, no_barrier), &sw->connectivity_state, &sw->closure); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      grpc_connected_subchannel_notify_on_state_change( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          exec_ctx, GET_CONNECTED_SUBCHANNEL(c, no_barrier), 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          &sw->connectivity_state, &sw->closure); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       GRPC_SUBCHANNEL_REF(c, "state_watcher"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       sw = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -390,7 +404,10 @@ static void subchannel_on_child_state_changed(grpc_exec_ctx *exec_ctx, void *p, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_free(sw); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void connected_subchannel_state_op(grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, grpc_connectivity_state *state, grpc_closure *closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void connected_subchannel_state_op(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          grpc_connected_subchannel *con, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          grpc_connectivity_state *state, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                          grpc_closure *closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_transport_op op; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_element *elem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   memset(&op, 0, sizeof(op)); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -400,12 +417,16 @@ static void connected_subchannel_state_op(grpc_exec_ctx *exec_ctx, grpc_connecte 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   elem->filter->start_transport_op(exec_ctx, elem, &op); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_connected_subchannel_notify_on_state_change(grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, grpc_connectivity_state *state, grpc_closure *closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_connected_subchannel_notify_on_state_change( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_connectivity_state *state, grpc_closure *closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GPR_ASSERT(state != NULL); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   connected_subchannel_state_op(exec_ctx, con, state, closure); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-void grpc_connected_subchannel_state_change_unsubscribe(grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, grpc_closure *closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_connected_subchannel_state_change_unsubscribe( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_closure *closure) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   connected_subchannel_state_op(exec_ctx, con, NULL, closure); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -429,7 +450,7 @@ static void publish_transport(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   channel_stack_size = grpc_channel_stack_size(filters, num_filters); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   con = gpr_malloc(sizeof(grpc_connected_subchannel) + channel_stack_size); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   stk = (grpc_channel_stack *)(con + 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_ref_init(&c->refs, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_ref_init(&con->refs, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_stack_init(exec_ctx, filters, num_filters, c->master, c->args, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                           stk); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_connected_channel_bind_transport(stk, c->connecting_result.transport); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -440,7 +461,8 @@ static void publish_transport(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sw_subchannel = gpr_malloc(sizeof(*sw_subchannel)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sw_subchannel->whom.subchannel = c; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   sw_subchannel->connectivity_state = GRPC_CHANNEL_READY; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_closure_init(&sw_subchannel->closure, subchannel_on_child_state_changed, sw_subchannel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_closure_init(&sw_subchannel->closure, subchannel_on_child_state_changed, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                    sw_subchannel); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu_lock(&c->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -458,28 +480,18 @@ static void publish_transport(grpc_exec_ctx *exec_ctx, grpc_subchannel *c) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GPR_ASSERT(gpr_atm_no_barrier_cas(&c->connected_subchannel, 0, (gpr_atm)con)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   c->connecting = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* setup subchannel watching connected subchannel for changes; subchannel ref for connecting is donated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  /* setup subchannel watching connected subchannel for changes; subchannel ref 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+     for connecting is donated 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				      to the state watcher */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GRPC_SUBCHANNEL_REF(c, "state_watcher"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GRPC_SUBCHANNEL_UNREF(exec_ctx, c, "connecting"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_connected_subchannel_notify_on_state_change(exec_ctx, con, &sw_subchannel->connectivity_state, &sw_subchannel->closure); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#if 0 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_transport_op op; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_channel_element *elem; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  /* setup connected subchannel watching transport for changes */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  memset(&op, 0, sizeof(op)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  op.connectivity_state = &sw_connected_subchannel->connectivity_state; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  op.on_connectivity_state_change = &sw_connected_subchannel->closure; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  op.bind_pollset_set = c->pollset_set; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  elem = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      grpc_channel_stack_element(CHANNEL_STACK_FROM_CONNECTION(con), 0); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  elem->filter->start_transport_op(exec_ctx, elem, &op); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-#endif 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_connected_subchannel_notify_on_state_change( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      exec_ctx, con, &sw_subchannel->connectivity_state, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      &sw_subchannel->closure); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   /* signal completion */ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_READY, "connected"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_READY, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                              "connected"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu_unlock(&c->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_free((void *)filters); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -559,7 +571,9 @@ static void subchannel_connected(grpc_exec_ctx *exec_ctx, void *arg, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_mu_lock(&c->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     GPR_ASSERT(!c->have_alarm); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     c->have_alarm = 1; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_connectivity_state_set(exec_ctx, &c->state_tracker, GRPC_CHANNEL_TRANSIENT_FAILURE, "connect_failed"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_connectivity_state_set(exec_ctx, &c->state_tracker, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                GRPC_CHANNEL_TRANSIENT_FAILURE, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+                                "connect_failed"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_timer_init(exec_ctx, &c->alarm, c->next_attempt, on_alarm, c, now); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_mu_unlock(&c->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -623,13 +637,14 @@ void grpc_subchannel_call_process_op(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   top_elem->filter->start_transport_stream_op(exec_ctx, top_elem, op); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-grpc_connected_subchannel *grpc_subchannel_get_connected_subchannel(grpc_subchannel *c) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+grpc_connected_subchannel *grpc_subchannel_get_connected_subchannel( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_subchannel *c) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   return GET_CONNECTED_SUBCHANNEL(c, acq); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-grpc_subchannel_call *grpc_connected_subchannel_create_call(grpc_exec_ctx *exec_ctx, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                         grpc_connected_subchannel *con, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-                                         grpc_pollset *pollset) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+grpc_subchannel_call *grpc_connected_subchannel_create_call( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_exec_ctx *exec_ctx, grpc_connected_subchannel *con, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_pollset *pollset) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel_stack *chanstk = CHANNEL_STACK_FROM_CONNECTION(con); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_subchannel_call *call = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				       gpr_malloc(sizeof(grpc_subchannel_call) + chanstk->call_stack_size); 
			 |