| OLD | NEW |
| 1 // Copyright 2014 The Chromium Authors. All rights reserved. | 1 // Copyright 2014 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #ifndef SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_ | 5 #ifndef SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_ |
| 6 #define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_ | 6 #define SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_ |
| 7 | 7 |
| 8 #include <map> | 8 #include <map> |
| 9 #include <memory> | 9 #include <memory> |
| 10 | 10 |
| 11 #include "base/callback.h" | 11 #include "base/callback.h" |
| 12 #include "base/macros.h" | 12 #include "base/macros.h" |
| 13 #include "base/memory/weak_ptr.h" | 13 #include "base/memory/weak_ptr.h" |
| 14 #include "mojo/public/cpp/bindings/binding.h" | 14 #include "mojo/public/cpp/bindings/binding.h" |
| 15 #include "mojo/public/cpp/system/core.h" | 15 #include "mojo/public/cpp/system/core.h" |
| 16 #include "services/service_manager/public/cpp/connector.h" | 16 #include "services/service_manager/public/cpp/connector.h" |
| 17 #include "services/service_manager/public/cpp/service.h" | 17 #include "services/service_manager/public/cpp/service.h" |
| 18 #include "services/service_manager/public/interfaces/connector.mojom.h" | 18 #include "services/service_manager/public/interfaces/connector.mojom.h" |
| 19 #include "services/service_manager/public/interfaces/service.mojom.h" | 19 #include "services/service_manager/public/interfaces/service.mojom.h" |
| 20 #include "services/service_manager/public/interfaces/service_control.mojom.h" | 20 #include "services/service_manager/public/interfaces/service_control.mojom.h" |
| 21 | 21 |
| 22 namespace service_manager { | 22 namespace service_manager { |
| 23 | 23 |
| 24 // Encapsulates a connection to the Service Manager in two parts: | 24 // Encapsulates a connection to the Service Manager in two parts: |
| 25 // |
| 25 // - a bound InterfacePtr to mojom::Connector, the primary mechanism | 26 // - a bound InterfacePtr to mojom::Connector, the primary mechanism |
| 26 // by which the instantiating service connects to other services, | 27 // by which the instantiating service connects to other services, |
| 27 // brokered by the Service Manager. | 28 // brokered by the Service Manager. |
| 29 // |
| 28 // - a bound InterfaceRequest of mojom::Service, an interface used by the | 30 // - a bound InterfaceRequest of mojom::Service, an interface used by the |
| 29 // Service Manager to inform this service of lifecycle events and | 31 // Service Manager to inform this service of lifecycle events and |
| 30 // inbound connections brokered by it. | 32 // inbound connections brokered by it. |
| 31 // | 33 // |
| 32 // This class owns an instance of a Service implementation, and there should be | 34 // This class owns an instance of a Service implementation, and there should be |
| 33 // exactly one instance of this class for every logical service instance running | 35 // exactly one instance of this class for every logical service instance running |
| 34 // in the system. | 36 // in the system. |
| 35 // | 37 // |
| 36 // This class is generally used to handle incoming mojom::ServiceRequests from | 38 // This class is generally used to handle incoming mojom::ServiceRequests from |
| 37 // the Service Manager. These can either come from ServiceRunner, from the | 39 // the Service Manager. These can either come from ServiceRunner, from the |
| (...skipping 17 matching lines...) Expand all Loading... |
| 55 mojom::ServiceRequest request, | 57 mojom::ServiceRequest request, |
| 56 std::unique_ptr<Connector> connector = nullptr, | 58 std::unique_ptr<Connector> connector = nullptr, |
| 57 mojom::ConnectorRequest connector_request = nullptr); | 59 mojom::ConnectorRequest connector_request = nullptr); |
| 58 | 60 |
| 59 ~ServiceContext() override; | 61 ~ServiceContext() override; |
| 60 | 62 |
| 61 Connector* connector() { return connector_.get(); } | 63 Connector* connector() { return connector_.get(); } |
| 62 const ServiceInfo& local_info() const { return local_info_; } | 64 const ServiceInfo& local_info() const { return local_info_; } |
| 63 const Identity& identity() const { return local_info_.identity; } | 65 const Identity& identity() const { return local_info_.identity; } |
| 64 | 66 |
| 65 // Specify a function to be called when the connection to the service manager | 67 // Specify a closure to be run when the Service calls QuitNow(), typically |
| 66 // is lost. Note that if connection has already been lost, then |closure| is | 68 // in response to Service::OnServiceManagerConnectionLost(). |
| 67 // called immediately. | |
| 68 // | 69 // |
| 69 // It is acceptable for |closure| to delete this ServiceContext. | 70 // Note that if the Service has already called QuitNow(), |closure| is run |
| 70 void SetConnectionLostClosure(const base::Closure& closure); | 71 // immediately from this method. |
| 72 // |
| 73 // NOTE: It is acceptable for |closure| to delete this ServiceContext. |
| 74 void SetQuitClosure(const base::Closure& closure); |
| 71 | 75 |
| 72 // Informs the Service Manager that this instance is ready to terminate. If | 76 // Informs the Service Manager that this instance is ready to terminate. If |
| 73 // the Service Manager has any outstanding connection requests for this | 77 // the Service Manager has any outstanding connection requests for this |
| 74 // instance, the request is ignored; the instance will eventually receive | 78 // instance, the request is ignored; the instance will eventually receive |
| 75 // the pending request(s) and can then appropriately decide whether or not | 79 // the pending request(s) and can then appropriately decide whether or not |
| 76 // it still wants to quit. | 80 // it still wants to quit. |
| 77 // | 81 // |
| 78 // If the request is granted, the Service Manager will service the connection | 82 // If the request is granted, the Service Manager will soon sever the |
| 79 // to this ServiceContext and Service::OnStop() will eventually be invoked. | 83 // connection to this ServiceContext, and |
| 84 // Service::OnServiceManagerConnectionLost() will be invoked at that time. |
| 80 void RequestQuit(); | 85 void RequestQuit(); |
| 81 | 86 |
| 82 // Immediately severs the connection to the Service Manager. | 87 // Immediately severs the connection to the Service Manager. |
| 83 // | 88 // |
| 84 // Note that calling this before the Service receives OnStop() can lead to | 89 // Note that calling this before the Service receives |
| 85 // unpredictable behavior, specifically because clients may have inbound | 90 // OnServiceManagerConnectionLost() can lead to unpredictable behavior, as the |
| 86 // connections in transit which may have already been brokered by the Service | 91 // Service Manager may have already brokered new inbound connections from |
| 87 // Manager and thus will be irreparably broken on the client side. | 92 // other services to this Service instance, and those connections will be |
| 93 // abruptly terminated as they can no longer result in OnConnect() or |
| 94 // OnBindInterface() calls on the Service. |
| 88 // | 95 // |
| 89 // Use of this call before OnStop() should be reserved for exceptional cases. | 96 // To put it another way: unless you want flaky connections to be a normal |
| 97 // experience for consumers of your service, avoid calling this before |
| 98 // receiving Service::OnServiceManagerConnectionLost(). |
| 90 void DisconnectFromServiceManager(); | 99 void DisconnectFromServiceManager(); |
| 91 | 100 |
| 92 // Immediately severs the connection to the Service Manager. | 101 // Immediately severs the connection to the Service Manager and invokes the |
| 93 // | 102 // quit closure (see SetQuitClosure() above) if one has been set. |
| 94 // If a connection-lost closure was set, it is immediately invoked. Note that | |
| 95 // it is never necessary or meaningful to call this after the Service | |
| 96 // has received OnStop(). | |
| 97 // | 103 // |
| 98 // See comments on DisconnectFromServiceManager() regarding abrupt | 104 // See comments on DisconnectFromServiceManager() regarding abrupt |
| 99 // disconnection from the Service Manager. | 105 // disconnection from the Service Manager. |
| 100 void QuitNow(); | 106 void QuitNow(); |
| 101 | 107 |
| 102 // Simliar to QuitNow() above but also destroys the Service instance. | |
| 103 void DestroyService(); | |
| 104 | |
| 105 private: | 108 private: |
| 106 friend class service_manager::Service; | 109 friend class service_manager::Service; |
| 107 | 110 |
| 108 using InterfaceRegistryMap = | 111 using InterfaceRegistryMap = |
| 109 std::map<InterfaceRegistry*, std::unique_ptr<InterfaceRegistry>>; | 112 std::map<InterfaceRegistry*, std::unique_ptr<InterfaceRegistry>>; |
| 110 | 113 |
| 111 // mojom::Service: | 114 // mojom::Service: |
| 112 void OnStart(const ServiceInfo& info, | 115 void OnStart(const ServiceInfo& info, |
| 113 const OnStartCallback& callback) override; | 116 const OnStartCallback& callback) override; |
| 114 void OnConnect(const ServiceInfo& source_info, | 117 void OnConnect(const ServiceInfo& source_info, |
| (...skipping 24 matching lines...) Expand all Loading... |
| 139 | 142 |
| 140 std::unique_ptr<service_manager::Service> service_; | 143 std::unique_ptr<service_manager::Service> service_; |
| 141 mojo::Binding<mojom::Service> binding_; | 144 mojo::Binding<mojom::Service> binding_; |
| 142 std::unique_ptr<Connector> connector_; | 145 std::unique_ptr<Connector> connector_; |
| 143 service_manager::ServiceInfo local_info_; | 146 service_manager::ServiceInfo local_info_; |
| 144 | 147 |
| 145 // This instance's control interface to the service manager. Note that this | 148 // This instance's control interface to the service manager. Note that this |
| 146 // is unbound and therefore invalid until OnStart() is called. | 149 // is unbound and therefore invalid until OnStart() is called. |
| 147 mojom::ServiceControlAssociatedPtr service_control_; | 150 mojom::ServiceControlAssociatedPtr service_control_; |
| 148 | 151 |
| 152 // The Service may call QuitNow() before SetConnectionLostClosure(), and the |
| 153 // latter is expected to invoke the closure immediately in that case. This is |
| 154 // used to track that condition. |
| 155 // |
| 156 // TODO(rockot): Figure out who depends on this behavior and make them stop. |
| 157 // It's weird and shouldn't be necessary. |
| 149 bool service_quit_ = false; | 158 bool service_quit_ = false; |
| 150 | 159 |
| 151 base::Closure connection_lost_closure_; | 160 // The closure to run when QuitNow() is invoked. May delete |this|. |
| 161 base::Closure quit_closure_; |
| 152 | 162 |
| 153 base::WeakPtrFactory<ServiceContext> weak_factory_; | 163 base::WeakPtrFactory<ServiceContext> weak_factory_; |
| 154 | 164 |
| 155 DISALLOW_COPY_AND_ASSIGN(ServiceContext); | 165 DISALLOW_COPY_AND_ASSIGN(ServiceContext); |
| 156 }; | 166 }; |
| 157 | 167 |
| 158 } // namespace service_manager | 168 } // namespace service_manager |
| 159 | 169 |
| 160 #endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_ | 170 #endif // SERVICES_SERVICE_MANAGER_PUBLIC_CPP_SERVICE_CONTEXT_H_ |
| OLD | NEW |