| 
					
				 | 
			
			
				@@ -46,44 +46,42 @@ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 typedef struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_connector base; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_refcount refs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  struct sockaddr *addr; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  int addr_len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_channel_args *args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } connector; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-typedef struct { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_subchannel_factory base; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_refcount refs; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_channel_args *args; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-} subchannel_factory; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void subchannel_factory_ref(grpc_subchannel_factory *scf) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  subchannel_factory *f = (subchannel_factory*)scf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_ref(&f->refs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void connector_ref(grpc_connector *con) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  connector *c = (connector *)con; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_ref(&c->refs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-static void subchannel_factory_unref(grpc_subchannel_factory *scf) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  subchannel_factory *f = (subchannel_factory*)scf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  if (gpr_unref(&f->refs)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    grpc_channel_args_destroy(f->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-    gpr_free(f); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void connector_unref(grpc_connector *con) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  connector *c = (connector *)con; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (gpr_unref(&c->refs)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gpr_free(c); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void connector_connect(grpc_connector *connector, const grpc_channel_args *channel_args, grpc_mdctx *metadata_context, grpc_transport **transport, grpc_iomgr_closure *notify) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  abort(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static const grpc_connector_vtable connector_vtable = {connector_ref, connector_unref, connector_connect}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void subchannel_factory_ref(grpc_subchannel_factory *scf) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static void subchannel_factory_unref(grpc_subchannel_factory *scf) {} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static grpc_subchannel *subchannel_factory_create_subchannel(grpc_subchannel_factory *scf, grpc_subchannel_args *args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  subchannel_factory *f = (subchannel_factory*)scf; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   connector *c = gpr_malloc(sizeof(*c)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_subchannel *s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   c->base.vtable = &connector_vtable; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_ref_init(&c->refs, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  c->addr = gpr_malloc(args->addr_len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  memcpy(c->addr, args->addr, args->addr_len); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  c->addr_len = args->addr_len; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  c->args = grpc_channel_args_merge(args->args, f->args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  return grpc_subchannel_create(&c->base); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  s = grpc_subchannel_create(&c->base, args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_connector_unref(&c->base); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return s; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 static const grpc_subchannel_factory_vtable subchannel_factory_vtable = {subchannel_factory_ref, subchannel_factory_unref, subchannel_factory_create_subchannel}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+static grpc_subchannel_factory subchannel_factory = {&subchannel_factory_vtable}; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 /* Create a client channel: 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				    Asynchronously: - resolve target 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -92,7 +90,6 @@ static const grpc_subchannel_factory_vtable subchannel_factory_vtable = {subchan 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 grpc_channel *grpc_channel_create(const char *target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				                                   const grpc_channel_args *args) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_channel *channel = NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  subchannel_factory *scfactory = gpr_malloc(sizeof(*scfactory)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 #define MAX_FILTERS 3 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   const grpc_channel_filter *filters[MAX_FILTERS]; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_resolver *resolver; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -104,11 +101,7 @@ grpc_channel *grpc_channel_create(const char *target, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   filters[n++] = &grpc_client_channel_filter; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   GPR_ASSERT(n <= MAX_FILTERS); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				  
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  scfactory->base.vtable = &subchannel_factory_vtable; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  gpr_ref_init(&scfactory->refs, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  scfactory->args = grpc_channel_args_copy(args); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				- 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  resolver = grpc_resolver_create(target, &scfactory->base); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  resolver = grpc_resolver_create(target, &subchannel_factory); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (!resolver) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     return NULL; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   } 
			 |