| Index: services/service_manager/public/cpp/service_context.h
|
| diff --git a/services/service_manager/public/cpp/service_context.h b/services/service_manager/public/cpp/service_context.h
|
| index a1af32c503bf700d32bc63d67e3e1d7909de5dc4..f843462bbc747de13ad67a475eaaafcca4701fdc 100644
|
| --- a/services/service_manager/public/cpp/service_context.h
|
| +++ b/services/service_manager/public/cpp/service_context.h
|
| @@ -22,9 +22,11 @@
|
| namespace service_manager {
|
|
|
| // Encapsulates a connection to the Service Manager in two parts:
|
| +//
|
| // - a bound InterfacePtr to mojom::Connector, the primary mechanism
|
| // by which the instantiating service connects to other services,
|
| // brokered by the Service Manager.
|
| +//
|
| // - a bound InterfaceRequest of mojom::Service, an interface used by the
|
| // Service Manager to inform this service of lifecycle events and
|
| // inbound connections brokered by it.
|
| @@ -62,12 +64,14 @@ class ServiceContext : public mojom::Service {
|
| const ServiceInfo& local_info() const { return local_info_; }
|
| const Identity& identity() const { return local_info_.identity; }
|
|
|
| - // Specify a function to be called when the connection to the service manager
|
| - // is lost. Note that if connection has already been lost, then |closure| is
|
| - // called immediately.
|
| + // Specify a closure to be run when the Service calls QuitNow(), typically
|
| + // in response to Service::OnServiceManagerConnectionLost().
|
| //
|
| - // It is acceptable for |closure| to delete this ServiceContext.
|
| - void SetConnectionLostClosure(const base::Closure& closure);
|
| + // Note that if the Service has already called QuitNow(), |closure| is run
|
| + // immediately from this method.
|
| + //
|
| + // NOTE: It is acceptable for |closure| to delete this ServiceContext.
|
| + void SetQuitClosure(const base::Closure& closure);
|
|
|
| // Informs the Service Manager that this instance is ready to terminate. If
|
| // the Service Manager has any outstanding connection requests for this
|
| @@ -75,33 +79,32 @@ class ServiceContext : public mojom::Service {
|
| // the pending request(s) and can then appropriately decide whether or not
|
| // it still wants to quit.
|
| //
|
| - // If the request is granted, the Service Manager will service the connection
|
| - // to this ServiceContext and Service::OnStop() will eventually be invoked.
|
| + // If the request is granted, the Service Manager will soon sever the
|
| + // connection to this ServiceContext, and
|
| + // Service::OnServiceManagerConnectionLost() will be invoked at that time.
|
| void RequestQuit();
|
|
|
| // Immediately severs the connection to the Service Manager.
|
| //
|
| - // Note that calling this before the Service receives OnStop() can lead to
|
| - // unpredictable behavior, specifically because clients may have inbound
|
| - // connections in transit which may have already been brokered by the Service
|
| - // Manager and thus will be irreparably broken on the client side.
|
| + // Note that calling this before the Service receives
|
| + // OnServiceManagerConnectionLost() can lead to unpredictable behavior, as the
|
| + // Service Manager may have already brokered new inbound connections from
|
| + // other services to this Service instance, and those connections will be
|
| + // abruptly terminated as they can no longer result in OnConnect() or
|
| + // OnBindInterface() calls on the Service.
|
| //
|
| - // Use of this call before OnStop() should be reserved for exceptional cases.
|
| + // To put it another way: unless you want flaky connections to be a normal
|
| + // experience for consumers of your service, avoid calling this before
|
| + // receiving Service::OnServiceManagerConnectionLost().
|
| void DisconnectFromServiceManager();
|
|
|
| - // Immediately severs the connection to the Service Manager.
|
| - //
|
| - // If a connection-lost closure was set, it is immediately invoked. Note that
|
| - // it is never necessary or meaningful to call this after the Service
|
| - // has received OnStop().
|
| + // Immediately severs the connection to the Service Manager and invokes the
|
| + // quit closure (see SetQuitClosure() above) if one has been set.
|
| //
|
| // See comments on DisconnectFromServiceManager() regarding abrupt
|
| // disconnection from the Service Manager.
|
| void QuitNow();
|
|
|
| - // Simliar to QuitNow() above but also destroys the Service instance.
|
| - void DestroyService();
|
| -
|
| private:
|
| friend class service_manager::Service;
|
|
|
| @@ -146,9 +149,16 @@ class ServiceContext : public mojom::Service {
|
| // is unbound and therefore invalid until OnStart() is called.
|
| mojom::ServiceControlAssociatedPtr service_control_;
|
|
|
| + // The Service may call QuitNow() before SetConnectionLostClosure(), and the
|
| + // latter is expected to invoke the closure immediately in that case. This is
|
| + // used to track that condition.
|
| + //
|
| + // TODO(rockot): Figure out who depends on this behavior and make them stop.
|
| + // It's weird and shouldn't be necessary.
|
| bool service_quit_ = false;
|
|
|
| - base::Closure connection_lost_closure_;
|
| + // The closure to run when QuitNow() is invoked. May delete |this|.
|
| + base::Closure quit_closure_;
|
|
|
| base::WeakPtrFactory<ServiceContext> weak_factory_;
|
|
|
|
|