|  | @@ -532,29 +532,11 @@ BackOff::Options ParseArgsForBackoffValues(
 | 
	
		
			
				|  |  |        .set_max_backoff(max_backoff_ms);
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -struct HealthCheckParams {
 | 
	
		
			
				|  |  | -  UniquePtr<char> service_name;
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  | -  static void Parse(const grpc_json* field, HealthCheckParams* params) {
 | 
	
		
			
				|  |  | -    if (strcmp(field->key, "healthCheckConfig") == 0) {
 | 
	
		
			
				|  |  | -      if (field->type != GRPC_JSON_OBJECT) return;
 | 
	
		
			
				|  |  | -      for (grpc_json* sub_field = field->child; sub_field != nullptr;
 | 
	
		
			
				|  |  | -           sub_field = sub_field->next) {
 | 
	
		
			
				|  |  | -        if (sub_field->key == nullptr) return;
 | 
	
		
			
				|  |  | -        if (strcmp(sub_field->key, "serviceName") == 0) {
 | 
	
		
			
				|  |  | -          if (params->service_name != nullptr) return;  // Duplicate.
 | 
	
		
			
				|  |  | -          if (sub_field->type != GRPC_JSON_STRING) return;
 | 
	
		
			
				|  |  | -          params->service_name.reset(gpr_strdup(sub_field->value));
 | 
	
		
			
				|  |  | -        }
 | 
	
		
			
				|  |  | -      }
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | -  }
 | 
	
		
			
				|  |  | -};
 | 
	
		
			
				|  |  | -
 | 
	
		
			
				|  |  |  }  // namespace
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Subchannel::Subchannel(SubchannelKey* key, grpc_connector* connector,
 | 
	
		
			
				|  |  | -                       const grpc_channel_args* args)
 | 
	
		
			
				|  |  | +                       const grpc_channel_args* args,
 | 
	
		
			
				|  |  | +                       const HealthCheckParsedObject* health_check)
 | 
	
		
			
				|  |  |      : key_(key),
 | 
	
		
			
				|  |  |        connector_(connector),
 | 
	
		
			
				|  |  |        backoff_(ParseArgsForBackoffValues(args, &min_connect_timeout_ms_)) {
 | 
	
	
		
			
				|  | @@ -586,20 +568,10 @@ Subchannel::Subchannel(SubchannelKey* key, grpc_connector* connector,
 | 
	
		
			
				|  |  |                                 "subchannel");
 | 
	
		
			
				|  |  |    grpc_connectivity_state_init(&state_and_health_tracker_, GRPC_CHANNEL_IDLE,
 | 
	
		
			
				|  |  |                                 "subchannel");
 | 
	
		
			
				|  |  | -  // Check whether we should enable health checking.
 | 
	
		
			
				|  |  | -  const char* service_config_json = grpc_channel_arg_get_string(
 | 
	
		
			
				|  |  | -      grpc_channel_args_find(args_, GRPC_ARG_SERVICE_CONFIG));
 | 
	
		
			
				|  |  | -  if (service_config_json != nullptr) {
 | 
	
		
			
				|  |  | -    grpc_error* service_config_error = GRPC_ERROR_NONE;
 | 
	
		
			
				|  |  | -    RefCountedPtr<ServiceConfig> service_config =
 | 
	
		
			
				|  |  | -        ServiceConfig::Create(service_config_json, &service_config_error);
 | 
	
		
			
				|  |  | -    // service_config_error is currently unused.
 | 
	
		
			
				|  |  | -    GRPC_ERROR_UNREF(service_config_error);
 | 
	
		
			
				|  |  | -    if (service_config != nullptr) {
 | 
	
		
			
				|  |  | -      HealthCheckParams params;
 | 
	
		
			
				|  |  | -      service_config->ParseGlobalParams(HealthCheckParams::Parse, ¶ms);
 | 
	
		
			
				|  |  | -      health_check_service_name_ = std::move(params.service_name);
 | 
	
		
			
				|  |  | -    }
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +  if (health_check != nullptr) {
 | 
	
		
			
				|  |  | +    health_check_service_name_ =
 | 
	
		
			
				|  |  | +        UniquePtr<char>(gpr_strdup(health_check->service_name()));
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  |    const grpc_arg* arg = grpc_channel_args_find(args_, GRPC_ARG_ENABLE_CHANNELZ);
 | 
	
		
			
				|  |  |    const bool channelz_enabled =
 | 
	
	
		
			
				|  | @@ -635,7 +607,8 @@ Subchannel::~Subchannel() {
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  Subchannel* Subchannel::Create(grpc_connector* connector,
 | 
	
		
			
				|  |  | -                               const grpc_channel_args* args) {
 | 
	
		
			
				|  |  | +                               const grpc_channel_args* args,
 | 
	
		
			
				|  |  | +                               const HealthCheckParsedObject* health_check) {
 | 
	
		
			
				|  |  |    SubchannelKey* key = New<SubchannelKey>(args);
 | 
	
		
			
				|  |  |    SubchannelPoolInterface* subchannel_pool =
 | 
	
		
			
				|  |  |        SubchannelPoolInterface::GetSubchannelPoolFromChannelArgs(args);
 | 
	
	
		
			
				|  | @@ -645,7 +618,7 @@ Subchannel* Subchannel::Create(grpc_connector* connector,
 | 
	
		
			
				|  |  |      Delete(key);
 | 
	
		
			
				|  |  |      return c;
 | 
	
		
			
				|  |  |    }
 | 
	
		
			
				|  |  | -  c = New<Subchannel>(key, connector, args);
 | 
	
		
			
				|  |  | +  c = New<Subchannel>(key, connector, args, health_check);
 | 
	
		
			
				|  |  |    // Try to register the subchannel before setting the subchannel pool.
 | 
	
		
			
				|  |  |    // Otherwise, in case of a registration race, unreffing c in
 | 
	
		
			
				|  |  |    // RegisterSubchannel() will cause c to be tried to be unregistered, while
 |