|  | @@ -235,6 +235,23 @@ grpc_channel* grpc_channel_create(const char* target,
 | 
	
		
			
				|  |  |                                    grpc_channel_stack_type channel_stack_type,
 | 
	
		
			
				|  |  |                                    grpc_transport* optional_transport,
 | 
	
		
			
				|  |  |                                    grpc_resource_user* resource_user) {
 | 
	
		
			
				|  |  | +  // We need to make sure that grpc_shutdown() does not shut things down
 | 
	
		
			
				|  |  | +  // until after the channel is destroyed.  However, the channel may not
 | 
	
		
			
				|  |  | +  // actually be destroyed by the time grpc_channel_destroy() returns,
 | 
	
		
			
				|  |  | +  // since there may be other existing refs to the channel.  If those
 | 
	
		
			
				|  |  | +  // refs are held by things that are visible to the wrapped language
 | 
	
		
			
				|  |  | +  // (such as outstanding calls on the channel), then the wrapped
 | 
	
		
			
				|  |  | +  // language can be responsible for making sure that grpc_shutdown()
 | 
	
		
			
				|  |  | +  // does not run until after those refs are released.  However, the
 | 
	
		
			
				|  |  | +  // channel may also have refs to itself held internally for various
 | 
	
		
			
				|  |  | +  // things that need to be cleaned up at channel destruction (e.g.,
 | 
	
		
			
				|  |  | +  // LB policies, subchannels, etc), and because these refs are not
 | 
	
		
			
				|  |  | +  // visible to the wrapped language, it cannot be responsible for
 | 
	
		
			
				|  |  | +  // deferring grpc_shutdown() until after they are released.  To
 | 
	
		
			
				|  |  | +  // accommodate that, we call grpc_init() here and then call
 | 
	
		
			
				|  |  | +  // grpc_shutdown() when the channel is actually destroyed, thus
 | 
	
		
			
				|  |  | +  // ensuring that shutdown is deferred until that point.
 | 
	
		
			
				|  |  | +  grpc_init();
 | 
	
		
			
				|  |  |    grpc_channel_stack_builder* builder = grpc_channel_stack_builder_create();
 | 
	
		
			
				|  |  |    const grpc_core::UniquePtr<char> default_authority =
 | 
	
		
			
				|  |  |        get_default_authority(input_args);
 | 
	
	
		
			
				|  | @@ -468,6 +485,8 @@ static void destroy_channel(void* arg, grpc_error* error) {
 | 
	
		
			
				|  |  |    gpr_mu_destroy(&channel->registered_call_mu);
 | 
	
		
			
				|  |  |    gpr_free(channel->target);
 | 
	
		
			
				|  |  |    gpr_free(channel);
 | 
	
		
			
				|  |  | +  // See comment in grpc_channel_create() for why we do this.
 | 
	
		
			
				|  |  | +  grpc_shutdown();
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  void grpc_channel_destroy(grpc_channel* channel) {
 |