Index: content/common/service_manager/child_connection.cc |
diff --git a/content/common/service_manager/child_connection.cc b/content/common/service_manager/child_connection.cc |
index 42faac05185213e5473761b1163261909b696a9a..63bea119e437d3039573d096f63c81a6e59fb1d8 100644 |
--- a/content/common/service_manager/child_connection.cc |
+++ b/content/common/service_manager/child_connection.cc |
@@ -8,6 +8,7 @@ |
#include <utility> |
#include "base/macros.h" |
+#include "content/common/child.mojom.h" |
#include "content/public/common/service_manager_connection.h" |
#include "mojo/edk/embedder/embedder.h" |
#include "mojo/public/cpp/system/message_pipe.h" |
@@ -18,20 +19,6 @@ |
namespace content { |
-namespace { |
- |
-void CallBinderOnTaskRunner( |
- const service_manager::InterfaceRegistry::Binder& binder, |
- scoped_refptr<base::SequencedTaskRunner> task_runner, |
- const std::string& interface_name, |
- mojo::ScopedMessagePipeHandle request_handle) { |
- task_runner->PostTask( |
- FROM_HERE, |
- base::Bind(binder, interface_name, base::Passed(&request_handle))); |
-} |
- |
-} // namespace |
- |
class ChildConnection::IOThreadContext |
: public base::RefCountedThreadSafe<IOThreadContext> { |
public: |
@@ -45,15 +32,22 @@ class ChildConnection::IOThreadContext |
io_task_runner_ = io_task_runner; |
std::unique_ptr<service_manager::Connector> io_thread_connector; |
if (connector) |
- io_thread_connector = connector->Clone(); |
+ connector_ = connector->Clone(); |
+ child_identity_ = child_identity; |
io_task_runner_->PostTask( |
FROM_HERE, |
base::Bind(&IOThreadContext::InitializeOnIOThread, this, |
child_identity, |
- base::Passed(&io_thread_connector), |
base::Passed(&service_pipe))); |
} |
+ void BindInterface(const std::string& interface_name, |
+ mojo::ScopedMessagePipeHandle interface_pipe) { |
+ io_task_runner_->PostTask( |
+ FROM_HERE, base::Bind(&IOThreadContext::BindInterfaceOnIOThread, this, |
+ interface_name, base::Passed(&interface_pipe))); |
+ } |
+ |
void ShutDown() { |
if (!io_task_runner_) |
return; |
@@ -63,12 +57,11 @@ class ChildConnection::IOThreadContext |
DCHECK(posted); |
} |
- void GetRemoteInterfaceOnIOThread( |
- const std::string& interface_name, |
- mojo::ScopedMessagePipeHandle request_handle) { |
- if (connection_) { |
- connection_->GetRemoteInterfaces()->GetInterface( |
- interface_name, std::move(request_handle)); |
+ void BindInterfaceOnIOThread(const std::string& interface_name, |
+ mojo::ScopedMessagePipeHandle request_handle) { |
+ if (connector_) { |
+ connector_->BindInterface(child_identity_, interface_name, |
+ std::move(request_handle)); |
} |
} |
@@ -86,7 +79,6 @@ class ChildConnection::IOThreadContext |
void InitializeOnIOThread( |
const service_manager::Identity& child_identity, |
- std::unique_ptr<service_manager::Connector> connector, |
mojo::ScopedMessagePipeHandle service_pipe) { |
service_manager::mojom::ServicePtr service; |
service.Bind(mojo::InterfacePtrInfo<service_manager::mojom::Service>( |
@@ -94,16 +86,15 @@ class ChildConnection::IOThreadContext |
service_manager::mojom::PIDReceiverRequest pid_receiver_request( |
&pid_receiver_); |
- if (connector) { |
- connector->StartService(child_identity, |
- std::move(service), |
- std::move(pid_receiver_request)); |
- connection_ = connector->Connect(child_identity); |
+ if (connector_) { |
+ connector_->StartService(child_identity, std::move(service), |
+ std::move(pid_receiver_request)); |
+ connector_->BindInterface(child_identity, &child_); |
} |
} |
void ShutDownOnIOThread() { |
- connection_.reset(); |
+ connector_.reset(); |
pid_receiver_.reset(); |
} |
@@ -114,7 +105,11 @@ class ChildConnection::IOThreadContext |
} |
scoped_refptr<base::SequencedTaskRunner> io_task_runner_; |
- std::unique_ptr<service_manager::Connection> connection_; |
+ // Usable from the IO thread only. |
+ std::unique_ptr<service_manager::Connector> connector_; |
+ service_manager::Identity child_identity_; |
+ // ServiceManagerConnection in the child monitors the lifetime of this pipe. |
+ mojom::ChildPtr child_; |
service_manager::mojom::PIDReceiverPtr pid_receiver_; |
DISALLOW_COPY_AND_ASSIGN(IOThreadContext); |
@@ -134,16 +129,18 @@ ChildConnection::ChildConnection( |
context_->Initialize(child_identity_, connector, |
process_connection->CreateMessagePipe(&service_token_), |
io_task_runner); |
- remote_interfaces_.Forward( |
- base::Bind(&CallBinderOnTaskRunner, |
- base::Bind(&IOThreadContext::GetRemoteInterfaceOnIOThread, |
- context_), io_task_runner)); |
} |
ChildConnection::~ChildConnection() { |
context_->ShutDown(); |
} |
+void ChildConnection::BindInterface( |
+ const std::string& interface_name, |
+ mojo::ScopedMessagePipeHandle interface_pipe) { |
+ context_->BindInterface(interface_name, std::move(interface_pipe)); |
+} |
+ |
void ChildConnection::SetProcessHandle(base::ProcessHandle handle) { |
process_handle_ = handle; |
context_->SetProcessHandle(handle); |