| Index: services/service_manager/public/cpp/lib/service_context.cc
|
| diff --git a/services/service_manager/public/cpp/lib/service_context.cc b/services/service_manager/public/cpp/lib/service_context.cc
|
| index f45202e56b2324dd81f75d51d817a88c810a7fff..64594597f962f66c88174bd97da967e6babbc4f4 100644
|
| --- a/services/service_manager/public/cpp/lib/service_context.cc
|
| +++ b/services/service_manager/public/cpp/lib/service_context.cc
|
| @@ -42,14 +42,18 @@ ServiceContext::ServiceContext(
|
| } else {
|
| DCHECK(pending_connector_request_.is_pending());
|
| }
|
| + service_->SetContext(this);
|
| }
|
|
|
| ServiceContext::~ServiceContext() {}
|
|
|
| -void ServiceContext::SetConnectionLostClosure(const base::Closure& closure) {
|
| - connection_lost_closure_ = closure;
|
| - if (service_quit_)
|
| - QuitNow();
|
| +void ServiceContext::SetQuitClosure(const base::Closure& closure) {
|
| + if (service_quit_) {
|
| + // CAUTION: May delete |this|.
|
| + closure.Run();
|
| + } else {
|
| + quit_closure_ = closure;
|
| + }
|
| }
|
|
|
| void ServiceContext::RequestQuit() {
|
| @@ -64,15 +68,13 @@ void ServiceContext::DisconnectFromServiceManager() {
|
| }
|
|
|
| void ServiceContext::QuitNow() {
|
| + service_quit_ = true;
|
| if (binding_.is_bound())
|
| binding_.Close();
|
| - if (!connection_lost_closure_.is_null())
|
| - base::ResetAndReturn(&connection_lost_closure_).Run();
|
| -}
|
| -
|
| -void ServiceContext::DestroyService() {
|
| - QuitNow();
|
| - service_.reset();
|
| + if (!quit_closure_.is_null()) {
|
| + // CAUTION: May delete |this|.
|
| + base::ResetAndReturn(&quit_closure_).Run();
|
| + }
|
| }
|
|
|
| ////////////////////////////////////////////////////////////////////////////////
|
| @@ -83,8 +85,6 @@ void ServiceContext::OnStart(const ServiceInfo& info,
|
| local_info_ = info;
|
| callback.Run(std::move(pending_connector_request_),
|
| mojo::MakeRequest(&service_control_));
|
| -
|
| - service_->set_context(this);
|
| service_->OnStart();
|
| }
|
|
|
| @@ -140,19 +140,10 @@ void ServiceContext::CallOnConnect(const ServiceInfo& source_info,
|
| }
|
|
|
| void ServiceContext::OnConnectionError() {
|
| - // Note that the Service doesn't technically have to quit now, it may live
|
| - // on to service existing connections. All existing Connectors however are
|
| - // invalid.
|
| - service_quit_ = service_->OnStop();
|
| - if (service_quit_) {
|
| + if (service_->OnServiceManagerConnectionLost()) {
|
| + // CAUTION: May delete |this|.
|
| QuitNow();
|
| - // NOTE: This call may delete |this|, so don't access any ServiceContext
|
| - // state beyond this point.
|
| - return;
|
| }
|
| -
|
| - // We don't reset the connector as clients may have taken a raw pointer to it.
|
| - // Connect() will return nullptr if they try to connect to anything.
|
| }
|
|
|
| void ServiceContext::OnRegistryConnectionError(InterfaceRegistry* registry) {
|
|
|