Index: content/common/service_manager/service_manager_connection_impl.cc |
diff --git a/content/common/service_manager/service_manager_connection_impl.cc b/content/common/service_manager/service_manager_connection_impl.cc |
index ac6d1f6fccbd57c79167662e0927ae1bdab0291a..971cfdd8f7323909ce82e951854a6a88bcc4b974 100644 |
--- a/content/common/service_manager/service_manager_connection_impl.cc |
+++ b/content/common/service_manager/service_manager_connection_impl.cc |
@@ -127,6 +127,34 @@ |
private: |
friend class base::RefCountedThreadSafe<IOThreadContext>; |
+ // A forwarding service_manager::Service implementation to account for the |
+ // fact that IOThreadContext is a Service which owns its ServiceContext, but |
+ // ServiceContext should own its Service. |
+ // |
+ // TODO(rockot): Clean this up. |
+ class ForwardingServiceImpl : public service_manager::Service { |
+ public: |
+ explicit ForwardingServiceImpl(service_manager::Service* service) |
+ : service_(service) {} |
+ ~ForwardingServiceImpl() override {} |
+ |
+ // service_manager::Service: |
+ void OnStart(service_manager::ServiceContext* context) override { |
+ service_->OnStart(context); |
+ } |
+ |
+ bool OnConnect(const service_manager::ServiceInfo& remote_info, |
+ service_manager::InterfaceRegistry* registry) override { |
+ return service_->OnConnect(remote_info, registry); |
+ } |
+ |
+ bool OnStop() override { return service_->OnStop(); } |
+ |
+ private: |
+ service_manager::Service* const service_; |
+ DISALLOW_COPY_AND_ASSIGN(ForwardingServiceImpl); |
+ }; |
+ |
class MessageLoopObserver : public base::MessageLoop::DestructionObserver { |
public: |
explicit MessageLoopObserver(base::WeakPtr<IOThreadContext> context) |
@@ -169,7 +197,7 @@ |
// Should bind |io_thread_checker_| to the context's thread. |
DCHECK(io_thread_checker_.CalledOnValidThread()); |
service_context_.reset(new service_manager::ServiceContext( |
- base::MakeUnique<service_manager::ForwardingService>(this), |
+ base::MakeUnique<ForwardingServiceImpl>(this), |
std::move(pending_service_request_), |
std::move(io_thread_connector_), |
std::move(pending_connector_request_))); |
@@ -223,10 +251,10 @@ |
///////////////////////////////////////////////////////////////////////////// |
// service_manager::Service implementation |
- void OnStart() override { |
+ void OnStart(service_manager::ServiceContext* context) override { |
DCHECK(io_thread_checker_.CalledOnValidThread()); |
DCHECK(!initialize_handler_.is_null()); |
- local_info_ = context()->local_info(); |
+ local_info_ = context->local_info(); |
InitializeCallback handler = base::ResetAndReturn(&initialize_handler_); |
callback_task_runner_->PostTask(FROM_HERE, |