| 
					
				 | 
			
			
				@@ -48,8 +48,6 @@ struct passthru_endpoint { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu mu; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   int halves; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   grpc_passthru_endpoint_stats* stats; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  grpc_passthru_endpoint_stats 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-      dummy_stats;  // used if constructor stats == nullptr 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   bool shutdown; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   half client; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   half server; 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -137,6 +135,7 @@ static void me_destroy(grpc_endpoint* ep) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   if (0 == --p->halves) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_mu_unlock(&p->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     gpr_mu_destroy(&p->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    grpc_passthru_endpoint_stats_destroy(p->stats); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_slice_buffer_destroy_internal(&p->client.read_buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_slice_buffer_destroy_internal(&p->server.read_buffer); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				     grpc_resource_user_unref(p->client.resource_user); 
			 | 
		
	
	
		
			
				| 
					
				 | 
			
			
				@@ -194,11 +193,30 @@ void grpc_passthru_endpoint_create(grpc_endpoint** client, 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   passthru_endpoint* m = (passthru_endpoint*)gpr_malloc(sizeof(*m)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   m->halves = 2; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   m->shutdown = 0; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  m->stats = stats == nullptr ? &m->dummy_stats : stats; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				-  memset(m->stats, 0, sizeof(*m->stats)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (stats == nullptr) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    m->stats = grpc_passthru_endpoint_stats_create(); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } else { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gpr_ref(&stats->refs); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    m->stats = stats; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   half_init(&m->client, m, resource_quota, "client"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   half_init(&m->server, m, resource_quota, "server"); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   gpr_mu_init(&m->mu); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   *client = &m->client.base; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				   *server = &m->server.base; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				 } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+grpc_passthru_endpoint_stats* grpc_passthru_endpoint_stats_create() { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  grpc_passthru_endpoint_stats* stats = 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+      (grpc_passthru_endpoint_stats*)gpr_malloc( 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+          sizeof(grpc_passthru_endpoint_stats)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  memset(stats, 0, sizeof(*stats)); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  gpr_ref_init(&stats->refs, 1); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  return stats; 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+ 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+void grpc_passthru_endpoint_stats_destroy(grpc_passthru_endpoint_stats* stats) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  if (gpr_unref(&stats->refs)) { 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+    gpr_free(stats); 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+  } 
			 | 
		
	
		
			
				 | 
				 | 
			
			
				+} 
			 |