| Index: services/service_manager/service_manager.cc
|
| diff --git a/services/service_manager/service_manager.cc b/services/service_manager/service_manager.cc
|
| index ed5e3044994bf5a44ed47a9c89fa1d9020b5348a..99b9869ee5b99b844139621efe4698041b13fee5 100644
|
| --- a/services/service_manager/service_manager.cc
|
| +++ b/services/service_manager/service_manager.cc
|
| @@ -322,8 +322,7 @@ class ServiceManager::Instance
|
| service.Bind(mojom::ServicePtrInfo(std::move(service_handle), 0));
|
| params->set_client_process_info(std::move(service),
|
| std::move(pid_receiver_request));
|
| - service_manager_->Connect(
|
| - std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| + service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void Connect(const service_manager::Identity& in_target,
|
| @@ -342,8 +341,7 @@ class ServiceManager::Instance
|
| params->set_target(target);
|
| params->set_remote_interfaces(std::move(remote_interfaces));
|
| params->set_connect_callback(callback);
|
| - service_manager_->Connect(
|
| - std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| + service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void BindInterface(const service_manager::Identity& in_target,
|
| @@ -364,8 +362,7 @@ class ServiceManager::Instance
|
| params->set_interface_request_info(interface_name,
|
| std::move(interface_pipe));
|
| params->set_bind_interface_callback(callback);
|
| - service_manager_->Connect(
|
| - std::move(params), nullptr, weak_factory_.GetWeakPtr());
|
| + service_manager_->Connect(std::move(params), weak_factory_.GetWeakPtr());
|
| }
|
|
|
| void Clone(mojom::ConnectorRequest request) override {
|
| @@ -685,22 +682,26 @@ void ServiceManager::SetInstanceQuitCallback(
|
| }
|
|
|
| void ServiceManager::Connect(std::unique_ptr<ConnectParams> params) {
|
| - Connect(std::move(params), nullptr, nullptr);
|
| + Connect(std::move(params), nullptr);
|
| }
|
|
|
| -mojom::ServiceRequest ServiceManager::StartEmbedderService(
|
| - const std::string& name) {
|
| - std::unique_ptr<ConnectParams> params(new ConnectParams);
|
| +void ServiceManager::RegisterService(
|
| + const Identity& identity,
|
| + mojom::ServicePtr service,
|
| + mojom::PIDReceiverRequest pid_receiver_request) {
|
| + auto params = base::MakeUnique<ConnectParams>();
|
|
|
| - Identity embedder_identity(name, mojom::kRootUserID);
|
| - params->set_source(embedder_identity);
|
| - params->set_target(embedder_identity);
|
| -
|
| - mojom::ServicePtr service;
|
| - mojom::ServiceRequest request(&service);
|
| - Connect(std::move(params), std::move(service), nullptr);
|
| + if (!pid_receiver_request.is_pending()) {
|
| + mojom::PIDReceiverPtr pid_receiver;
|
| + pid_receiver_request = mojom::PIDReceiverRequest(&pid_receiver);
|
| + pid_receiver->SetPID(base::Process::Current().Pid());
|
| + }
|
|
|
| - return request;
|
| + params->set_source(identity);
|
| + params->set_target(identity);
|
| + params->set_client_process_info(
|
| + std::move(service), std::move(pid_receiver_request));
|
| + Connect(std::move(params), nullptr);
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -765,7 +766,6 @@ void ServiceManager::OnInstanceStopped(const Identity& identity) {
|
| }
|
|
|
| void ServiceManager::Connect(std::unique_ptr<ConnectParams> params,
|
| - mojom::ServicePtr service,
|
| base::WeakPtr<Instance> source_instance) {
|
| TRACE_EVENT_INSTANT1("service_manager", "ServiceManager::Connect",
|
| TRACE_EVENT_SCOPE_THREAD, "original_name",
|
| @@ -773,10 +773,11 @@ void ServiceManager::Connect(std::unique_ptr<ConnectParams> params,
|
| DCHECK(!params->target().name().empty());
|
| DCHECK(base::IsValidGUID(params->target().user_id()));
|
| DCHECK_NE(mojom::kInheritUserID, params->target().user_id());
|
| - DCHECK(!service.is_bound() || !identity_to_instance_.count(params->target()));
|
| + DCHECK(!params->HasClientProcessInfo() ||
|
| + !identity_to_instance_.count(params->target()));
|
|
|
| // Connect to an existing matching instance, if possible.
|
| - if (!service.is_bound() && ConnectToExistingInstance(¶ms))
|
| + if (!params->HasClientProcessInfo() && ConnectToExistingInstance(¶ms))
|
| return;
|
|
|
| // The catalog needs to see the source identity as that of the originating
|
| @@ -791,7 +792,7 @@ void ServiceManager::Connect(std::unique_ptr<ConnectParams> params,
|
| name,
|
| base::Bind(&service_manager::ServiceManager::OnGotResolvedName,
|
| weak_ptr_factory_.GetWeakPtr(), base::Passed(¶ms),
|
| - base::Passed(&service), !!source_instance, source_instance));
|
| + !!source_instance, source_instance));
|
| }
|
|
|
| ServiceManager::Instance* ServiceManager::GetExistingInstance(
|
| @@ -932,7 +933,6 @@ void ServiceManager::OnServiceFactoryLost(const Identity& which) {
|
| }
|
|
|
| void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
| - mojom::ServicePtr service,
|
| bool has_source_instance,
|
| base::WeakPtr<Instance> source_instance,
|
| mojom::ResolveResultPtr result,
|
| @@ -992,12 +992,8 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
|
|
| // Below are various paths through which a new Instance can be bound to a
|
| // Service proxy.
|
| - if (service.is_bound()) {
|
| - // If a ServicePtr was provided, there's no more work to do: someone
|
| - // is already holding a corresponding ServiceRequest.
|
| - instance->StartWithService(std::move(service));
|
| - } else if (params->HasClientProcessInfo()) {
|
| - // This branch should be reachable only via a call to RegisterService(). We
|
| + if (params->HasClientProcessInfo()) {
|
| + // This branch should be reachable only via a call to RegisterService() . We
|
| // start the instance but return early before we connect to it. Clients will
|
| // call Connect() with the target identity subsequently.
|
| instance->BindPIDReceiver(params->TakePIDReceiverRequest());
|
| @@ -1005,6 +1001,7 @@ void ServiceManager::OnGotResolvedName(std::unique_ptr<ConnectParams> params,
|
| return;
|
| } else {
|
| // Otherwise we create a new Service pipe.
|
| + mojom::ServicePtr service;
|
| mojom::ServiceRequest request(&service);
|
|
|
| // The catalog was unable to read a manifest for this service. We can't do
|
|
|