xref: /aosp_15_r20/system/libhidl/transport/HidlLazyUtils.cpp (revision 8222fbe171c3d6fadfe95119c180cf3010c392a8)
1*8222fbe1SAndroid Build Coastguard Worker /*
2*8222fbe1SAndroid Build Coastguard Worker  * Copyright (C) 2018 The Android Open Source Project
3*8222fbe1SAndroid Build Coastguard Worker  *
4*8222fbe1SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*8222fbe1SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*8222fbe1SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*8222fbe1SAndroid Build Coastguard Worker  *
8*8222fbe1SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*8222fbe1SAndroid Build Coastguard Worker  *
10*8222fbe1SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*8222fbe1SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*8222fbe1SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*8222fbe1SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*8222fbe1SAndroid Build Coastguard Worker  * limitations under the License.
15*8222fbe1SAndroid Build Coastguard Worker  */
16*8222fbe1SAndroid Build Coastguard Worker 
17*8222fbe1SAndroid Build Coastguard Worker #define LOG_TAG "HidlLazyUtils"
18*8222fbe1SAndroid Build Coastguard Worker 
19*8222fbe1SAndroid Build Coastguard Worker #include <hidl/HidlLazyUtils.h>
20*8222fbe1SAndroid Build Coastguard Worker #include <hidl/HidlTransportSupport.h>
21*8222fbe1SAndroid Build Coastguard Worker 
22*8222fbe1SAndroid Build Coastguard Worker #include <android-base/logging.h>
23*8222fbe1SAndroid Build Coastguard Worker 
24*8222fbe1SAndroid Build Coastguard Worker #include <android/hidl/manager/1.2/IClientCallback.h>
25*8222fbe1SAndroid Build Coastguard Worker #include <android/hidl/manager/1.2/IServiceManager.h>
26*8222fbe1SAndroid Build Coastguard Worker 
27*8222fbe1SAndroid Build Coastguard Worker namespace android {
28*8222fbe1SAndroid Build Coastguard Worker namespace hardware {
29*8222fbe1SAndroid Build Coastguard Worker namespace details {
30*8222fbe1SAndroid Build Coastguard Worker 
31*8222fbe1SAndroid Build Coastguard Worker using ::android::hidl::base::V1_0::IBase;
32*8222fbe1SAndroid Build Coastguard Worker 
33*8222fbe1SAndroid Build Coastguard Worker class ClientCounterCallback : public ::android::hidl::manager::V1_2::IClientCallback {
34*8222fbe1SAndroid Build Coastguard Worker   public:
ClientCounterCallback()35*8222fbe1SAndroid Build Coastguard Worker     ClientCounterCallback() {}
36*8222fbe1SAndroid Build Coastguard Worker 
37*8222fbe1SAndroid Build Coastguard Worker     bool addRegisteredService(const sp<IBase>& service, const std::string& name);
38*8222fbe1SAndroid Build Coastguard Worker 
39*8222fbe1SAndroid Build Coastguard Worker     bool tryUnregisterLocked();
40*8222fbe1SAndroid Build Coastguard Worker 
41*8222fbe1SAndroid Build Coastguard Worker     void reRegisterLocked();
42*8222fbe1SAndroid Build Coastguard Worker 
43*8222fbe1SAndroid Build Coastguard Worker     void setActiveServicesCallback(const std::function<bool(bool)>& activeServicesCallback);
44*8222fbe1SAndroid Build Coastguard Worker 
45*8222fbe1SAndroid Build Coastguard Worker   protected:
46*8222fbe1SAndroid Build Coastguard Worker     Return<void> onClients(const sp<IBase>& service, bool clients) override;
47*8222fbe1SAndroid Build Coastguard Worker 
48*8222fbe1SAndroid Build Coastguard Worker   private:
49*8222fbe1SAndroid Build Coastguard Worker     struct Service {
50*8222fbe1SAndroid Build Coastguard Worker         sp<IBase> service;
51*8222fbe1SAndroid Build Coastguard Worker         std::string name;
52*8222fbe1SAndroid Build Coastguard Worker         bool clients = false;
53*8222fbe1SAndroid Build Coastguard Worker         // Used to keep track of unregistered services to allow re-registry
54*8222fbe1SAndroid Build Coastguard Worker         bool registered = true;
55*8222fbe1SAndroid Build Coastguard Worker     };
56*8222fbe1SAndroid Build Coastguard Worker 
57*8222fbe1SAndroid Build Coastguard Worker     /**
58*8222fbe1SAndroid Build Coastguard Worker      * Looks up service that is guaranteed to be registered (service from
59*8222fbe1SAndroid Build Coastguard Worker      * onClients).
60*8222fbe1SAndroid Build Coastguard Worker      */
61*8222fbe1SAndroid Build Coastguard Worker     Service& assertRegisteredServiceLocked(const sp<IBase>& service);
62*8222fbe1SAndroid Build Coastguard Worker 
63*8222fbe1SAndroid Build Coastguard Worker     /**
64*8222fbe1SAndroid Build Coastguard Worker      * Registers or re-registers services. Returns whether successful.
65*8222fbe1SAndroid Build Coastguard Worker      */
66*8222fbe1SAndroid Build Coastguard Worker     bool registerServiceLocked(const sp<IBase>& service, const std::string& name);
67*8222fbe1SAndroid Build Coastguard Worker 
68*8222fbe1SAndroid Build Coastguard Worker     /**
69*8222fbe1SAndroid Build Coastguard Worker      * Unregisters all services that we can. If we can't unregister all, re-register other
70*8222fbe1SAndroid Build Coastguard Worker      * services.
71*8222fbe1SAndroid Build Coastguard Worker      */
72*8222fbe1SAndroid Build Coastguard Worker     void tryShutdownLocked();
73*8222fbe1SAndroid Build Coastguard Worker 
74*8222fbe1SAndroid Build Coastguard Worker     /**
75*8222fbe1SAndroid Build Coastguard Worker      * For below.
76*8222fbe1SAndroid Build Coastguard Worker      */
77*8222fbe1SAndroid Build Coastguard Worker     std::mutex mMutex;
78*8222fbe1SAndroid Build Coastguard Worker 
79*8222fbe1SAndroid Build Coastguard Worker     /**
80*8222fbe1SAndroid Build Coastguard Worker      * Number of services that have been registered.
81*8222fbe1SAndroid Build Coastguard Worker      */
82*8222fbe1SAndroid Build Coastguard Worker     std::vector<Service> mRegisteredServices;
83*8222fbe1SAndroid Build Coastguard Worker 
84*8222fbe1SAndroid Build Coastguard Worker     /**
85*8222fbe1SAndroid Build Coastguard Worker      * Callback for reporting the number of services with clients.
86*8222fbe1SAndroid Build Coastguard Worker      */
87*8222fbe1SAndroid Build Coastguard Worker     std::function<bool(bool)> mActiveServicesCallback;
88*8222fbe1SAndroid Build Coastguard Worker 
89*8222fbe1SAndroid Build Coastguard Worker     /**
90*8222fbe1SAndroid Build Coastguard Worker      * Previous value passed to the active services callback.
91*8222fbe1SAndroid Build Coastguard Worker      */
92*8222fbe1SAndroid Build Coastguard Worker     std::optional<bool> mPreviousHasClients;
93*8222fbe1SAndroid Build Coastguard Worker };
94*8222fbe1SAndroid Build Coastguard Worker 
95*8222fbe1SAndroid Build Coastguard Worker class LazyServiceRegistrarImpl {
96*8222fbe1SAndroid Build Coastguard Worker   public:
LazyServiceRegistrarImpl()97*8222fbe1SAndroid Build Coastguard Worker     LazyServiceRegistrarImpl() : mClientCallback(new ClientCounterCallback) {}
98*8222fbe1SAndroid Build Coastguard Worker 
99*8222fbe1SAndroid Build Coastguard Worker     status_t registerService(const sp<::android::hidl::base::V1_0::IBase>& service,
100*8222fbe1SAndroid Build Coastguard Worker                              const std::string& name);
101*8222fbe1SAndroid Build Coastguard Worker     bool tryUnregister();
102*8222fbe1SAndroid Build Coastguard Worker     void reRegister();
103*8222fbe1SAndroid Build Coastguard Worker     void setActiveServicesCallback(const std::function<bool(bool)>& activeServicesCallback);
104*8222fbe1SAndroid Build Coastguard Worker 
105*8222fbe1SAndroid Build Coastguard Worker   private:
106*8222fbe1SAndroid Build Coastguard Worker     sp<ClientCounterCallback> mClientCallback;
107*8222fbe1SAndroid Build Coastguard Worker };
108*8222fbe1SAndroid Build Coastguard Worker 
addRegisteredService(const sp<IBase> & service,const std::string & name)109*8222fbe1SAndroid Build Coastguard Worker bool ClientCounterCallback::addRegisteredService(const sp<IBase>& service,
110*8222fbe1SAndroid Build Coastguard Worker                                                  const std::string& name) {
111*8222fbe1SAndroid Build Coastguard Worker     std::lock_guard<std::mutex> lock(mMutex);
112*8222fbe1SAndroid Build Coastguard Worker     bool success = registerServiceLocked(service, name);
113*8222fbe1SAndroid Build Coastguard Worker 
114*8222fbe1SAndroid Build Coastguard Worker     if (success) {
115*8222fbe1SAndroid Build Coastguard Worker         mRegisteredServices.push_back({service, name});
116*8222fbe1SAndroid Build Coastguard Worker     }
117*8222fbe1SAndroid Build Coastguard Worker 
118*8222fbe1SAndroid Build Coastguard Worker     return success;
119*8222fbe1SAndroid Build Coastguard Worker }
120*8222fbe1SAndroid Build Coastguard Worker 
assertRegisteredServiceLocked(const sp<IBase> & service)121*8222fbe1SAndroid Build Coastguard Worker ClientCounterCallback::Service& ClientCounterCallback::assertRegisteredServiceLocked(
122*8222fbe1SAndroid Build Coastguard Worker         const sp<IBase>& service) {
123*8222fbe1SAndroid Build Coastguard Worker     for (Service& registered : mRegisteredServices) {
124*8222fbe1SAndroid Build Coastguard Worker         if (registered.service != service) continue;
125*8222fbe1SAndroid Build Coastguard Worker         return registered;
126*8222fbe1SAndroid Build Coastguard Worker     }
127*8222fbe1SAndroid Build Coastguard Worker     LOG(FATAL) << "Got callback on service " << getDescriptor(service.get())
128*8222fbe1SAndroid Build Coastguard Worker                << " which we did not register.";
129*8222fbe1SAndroid Build Coastguard Worker     __builtin_unreachable();
130*8222fbe1SAndroid Build Coastguard Worker }
131*8222fbe1SAndroid Build Coastguard Worker 
registerServiceLocked(const sp<IBase> & service,const std::string & name)132*8222fbe1SAndroid Build Coastguard Worker bool ClientCounterCallback::registerServiceLocked(const sp<IBase>& service,
133*8222fbe1SAndroid Build Coastguard Worker                                                   const std::string& name) {
134*8222fbe1SAndroid Build Coastguard Worker     auto manager = hardware::defaultServiceManager1_2();
135*8222fbe1SAndroid Build Coastguard Worker 
136*8222fbe1SAndroid Build Coastguard Worker     const std::string descriptor = getDescriptor(service.get());
137*8222fbe1SAndroid Build Coastguard Worker 
138*8222fbe1SAndroid Build Coastguard Worker     LOG(INFO) << "Registering HAL: " << descriptor << " with name: " << name;
139*8222fbe1SAndroid Build Coastguard Worker 
140*8222fbe1SAndroid Build Coastguard Worker     status_t res = android::hardware::details::registerAsServiceInternal(service, name);
141*8222fbe1SAndroid Build Coastguard Worker     if (res != android::OK) {
142*8222fbe1SAndroid Build Coastguard Worker         LOG(ERROR) << "Failed to register as service.";
143*8222fbe1SAndroid Build Coastguard Worker         return false;
144*8222fbe1SAndroid Build Coastguard Worker     }
145*8222fbe1SAndroid Build Coastguard Worker 
146*8222fbe1SAndroid Build Coastguard Worker     bool ret = manager->registerClientCallback(getDescriptor(service.get()), name, service, this);
147*8222fbe1SAndroid Build Coastguard Worker     if (!ret) {
148*8222fbe1SAndroid Build Coastguard Worker         LOG(ERROR) << "Failed to add client callback.";
149*8222fbe1SAndroid Build Coastguard Worker         return false;
150*8222fbe1SAndroid Build Coastguard Worker     }
151*8222fbe1SAndroid Build Coastguard Worker 
152*8222fbe1SAndroid Build Coastguard Worker     return true;
153*8222fbe1SAndroid Build Coastguard Worker }
154*8222fbe1SAndroid Build Coastguard Worker 
onClients(const sp<::android::hidl::base::V1_0::IBase> & service,bool clients)155*8222fbe1SAndroid Build Coastguard Worker Return<void> ClientCounterCallback::onClients(const sp<::android::hidl::base::V1_0::IBase>& service,
156*8222fbe1SAndroid Build Coastguard Worker                                               bool clients) {
157*8222fbe1SAndroid Build Coastguard Worker     std::lock_guard<std::mutex> lock(mMutex);
158*8222fbe1SAndroid Build Coastguard Worker     Service& registered = assertRegisteredServiceLocked(service);
159*8222fbe1SAndroid Build Coastguard Worker     if (registered.clients == clients) {
160*8222fbe1SAndroid Build Coastguard Worker         LOG(FATAL) << "Process already thought " << getDescriptor(service.get()) << "/"
161*8222fbe1SAndroid Build Coastguard Worker                    << registered.name << " had clients: " << registered.clients
162*8222fbe1SAndroid Build Coastguard Worker                    << " but hwservicemanager has notified has clients: " << clients;
163*8222fbe1SAndroid Build Coastguard Worker     }
164*8222fbe1SAndroid Build Coastguard Worker     registered.clients = clients;
165*8222fbe1SAndroid Build Coastguard Worker 
166*8222fbe1SAndroid Build Coastguard Worker     size_t numWithClients = 0;
167*8222fbe1SAndroid Build Coastguard Worker     for (const Service& registered : mRegisteredServices) {
168*8222fbe1SAndroid Build Coastguard Worker         if (registered.clients) numWithClients++;
169*8222fbe1SAndroid Build Coastguard Worker     }
170*8222fbe1SAndroid Build Coastguard Worker 
171*8222fbe1SAndroid Build Coastguard Worker     LOG(INFO) << "Process has " << numWithClients << " (of " << mRegisteredServices.size()
172*8222fbe1SAndroid Build Coastguard Worker               << " available) client(s) in use after notification " << getDescriptor(service.get())
173*8222fbe1SAndroid Build Coastguard Worker               << "/" << registered.name << " has clients: " << clients;
174*8222fbe1SAndroid Build Coastguard Worker 
175*8222fbe1SAndroid Build Coastguard Worker     bool handledInCallback = false;
176*8222fbe1SAndroid Build Coastguard Worker     if (mActiveServicesCallback != nullptr) {
177*8222fbe1SAndroid Build Coastguard Worker         bool hasClients = numWithClients != 0;
178*8222fbe1SAndroid Build Coastguard Worker         if (hasClients != mPreviousHasClients) {
179*8222fbe1SAndroid Build Coastguard Worker             handledInCallback = mActiveServicesCallback(hasClients);
180*8222fbe1SAndroid Build Coastguard Worker             mPreviousHasClients = hasClients;
181*8222fbe1SAndroid Build Coastguard Worker         }
182*8222fbe1SAndroid Build Coastguard Worker     }
183*8222fbe1SAndroid Build Coastguard Worker 
184*8222fbe1SAndroid Build Coastguard Worker     // If there is no callback defined or the callback did not handle this
185*8222fbe1SAndroid Build Coastguard Worker     // client count change event, try to shutdown the process if its services
186*8222fbe1SAndroid Build Coastguard Worker     // have no clients.
187*8222fbe1SAndroid Build Coastguard Worker     if (!handledInCallback && numWithClients == 0) {
188*8222fbe1SAndroid Build Coastguard Worker         tryShutdownLocked();
189*8222fbe1SAndroid Build Coastguard Worker     }
190*8222fbe1SAndroid Build Coastguard Worker 
191*8222fbe1SAndroid Build Coastguard Worker     return Status::ok();
192*8222fbe1SAndroid Build Coastguard Worker }
193*8222fbe1SAndroid Build Coastguard Worker 
tryUnregisterLocked()194*8222fbe1SAndroid Build Coastguard Worker bool ClientCounterCallback::tryUnregisterLocked() {
195*8222fbe1SAndroid Build Coastguard Worker     auto manager = hardware::defaultServiceManager1_2();
196*8222fbe1SAndroid Build Coastguard Worker 
197*8222fbe1SAndroid Build Coastguard Worker     for (Service& entry : mRegisteredServices) {
198*8222fbe1SAndroid Build Coastguard Worker         const std::string descriptor = getDescriptor(entry.service.get());
199*8222fbe1SAndroid Build Coastguard Worker         bool success = manager->tryUnregister(descriptor, entry.name, entry.service);
200*8222fbe1SAndroid Build Coastguard Worker 
201*8222fbe1SAndroid Build Coastguard Worker         if (!success) {
202*8222fbe1SAndroid Build Coastguard Worker             LOG(INFO) << "Failed to unregister HAL " << descriptor << "/" << entry.name;
203*8222fbe1SAndroid Build Coastguard Worker             return false;
204*8222fbe1SAndroid Build Coastguard Worker         }
205*8222fbe1SAndroid Build Coastguard Worker 
206*8222fbe1SAndroid Build Coastguard Worker         // Mark the entry unregistered, but do not remove it (may still be re-registered)
207*8222fbe1SAndroid Build Coastguard Worker         entry.registered = false;
208*8222fbe1SAndroid Build Coastguard Worker     }
209*8222fbe1SAndroid Build Coastguard Worker 
210*8222fbe1SAndroid Build Coastguard Worker     return true;
211*8222fbe1SAndroid Build Coastguard Worker }
212*8222fbe1SAndroid Build Coastguard Worker 
reRegisterLocked()213*8222fbe1SAndroid Build Coastguard Worker void ClientCounterCallback::reRegisterLocked() {
214*8222fbe1SAndroid Build Coastguard Worker     for (Service& entry : mRegisteredServices) {
215*8222fbe1SAndroid Build Coastguard Worker         // re-register entry if not already registered
216*8222fbe1SAndroid Build Coastguard Worker         if (entry.registered) {
217*8222fbe1SAndroid Build Coastguard Worker             continue;
218*8222fbe1SAndroid Build Coastguard Worker         }
219*8222fbe1SAndroid Build Coastguard Worker 
220*8222fbe1SAndroid Build Coastguard Worker         if (!registerServiceLocked(entry.service, entry.name)) {
221*8222fbe1SAndroid Build Coastguard Worker             // Must restart. Otherwise, clients will never be able to get ahold of this service.
222*8222fbe1SAndroid Build Coastguard Worker             LOG(FATAL) << "Bad state: could not re-register " << getDescriptor(entry.service.get());
223*8222fbe1SAndroid Build Coastguard Worker         }
224*8222fbe1SAndroid Build Coastguard Worker 
225*8222fbe1SAndroid Build Coastguard Worker         entry.registered = true;
226*8222fbe1SAndroid Build Coastguard Worker     }
227*8222fbe1SAndroid Build Coastguard Worker }
228*8222fbe1SAndroid Build Coastguard Worker 
tryShutdownLocked()229*8222fbe1SAndroid Build Coastguard Worker void ClientCounterCallback::tryShutdownLocked() {
230*8222fbe1SAndroid Build Coastguard Worker     LOG(INFO) << "Trying to exit HAL. No clients in use for any service in process.";
231*8222fbe1SAndroid Build Coastguard Worker 
232*8222fbe1SAndroid Build Coastguard Worker     if (tryUnregisterLocked()) {
233*8222fbe1SAndroid Build Coastguard Worker         LOG(INFO) << "Unregistered all clients and exiting";
234*8222fbe1SAndroid Build Coastguard Worker         exit(EXIT_SUCCESS);
235*8222fbe1SAndroid Build Coastguard Worker     }
236*8222fbe1SAndroid Build Coastguard Worker 
237*8222fbe1SAndroid Build Coastguard Worker     // At this point, we failed to unregister some of the services, leaving the
238*8222fbe1SAndroid Build Coastguard Worker     // server in an inconsistent state. Re-register all services that were
239*8222fbe1SAndroid Build Coastguard Worker     // unregistered by tryUnregisterLocked().
240*8222fbe1SAndroid Build Coastguard Worker     reRegisterLocked();
241*8222fbe1SAndroid Build Coastguard Worker }
242*8222fbe1SAndroid Build Coastguard Worker 
setActiveServicesCallback(const std::function<bool (bool)> & activeServicesCallback)243*8222fbe1SAndroid Build Coastguard Worker void ClientCounterCallback::setActiveServicesCallback(
244*8222fbe1SAndroid Build Coastguard Worker         const std::function<bool(bool)>& activeServicesCallback) {
245*8222fbe1SAndroid Build Coastguard Worker     std::lock_guard<std::mutex> lock(mMutex);
246*8222fbe1SAndroid Build Coastguard Worker 
247*8222fbe1SAndroid Build Coastguard Worker     mActiveServicesCallback = activeServicesCallback;
248*8222fbe1SAndroid Build Coastguard Worker }
249*8222fbe1SAndroid Build Coastguard Worker 
registerService(const sp<::android::hidl::base::V1_0::IBase> & service,const std::string & name)250*8222fbe1SAndroid Build Coastguard Worker status_t LazyServiceRegistrarImpl::registerService(
251*8222fbe1SAndroid Build Coastguard Worker     const sp<::android::hidl::base::V1_0::IBase>& service, const std::string& name) {
252*8222fbe1SAndroid Build Coastguard Worker     if (!mClientCallback->addRegisteredService(service, name)) {
253*8222fbe1SAndroid Build Coastguard Worker         return ::android::UNKNOWN_ERROR;
254*8222fbe1SAndroid Build Coastguard Worker     }
255*8222fbe1SAndroid Build Coastguard Worker 
256*8222fbe1SAndroid Build Coastguard Worker     return ::android::OK;
257*8222fbe1SAndroid Build Coastguard Worker }
258*8222fbe1SAndroid Build Coastguard Worker 
tryUnregister()259*8222fbe1SAndroid Build Coastguard Worker bool LazyServiceRegistrarImpl::tryUnregister() {
260*8222fbe1SAndroid Build Coastguard Worker     // see comments in header, this should only be called from the active
261*8222fbe1SAndroid Build Coastguard Worker     // services callback, see also b/191781736
262*8222fbe1SAndroid Build Coastguard Worker     return mClientCallback->tryUnregisterLocked();
263*8222fbe1SAndroid Build Coastguard Worker }
264*8222fbe1SAndroid Build Coastguard Worker 
reRegister()265*8222fbe1SAndroid Build Coastguard Worker void LazyServiceRegistrarImpl::reRegister() {
266*8222fbe1SAndroid Build Coastguard Worker     // see comments in header, this should only be called from the active
267*8222fbe1SAndroid Build Coastguard Worker     // services callback, see also b/191781736
268*8222fbe1SAndroid Build Coastguard Worker     mClientCallback->reRegisterLocked();
269*8222fbe1SAndroid Build Coastguard Worker }
270*8222fbe1SAndroid Build Coastguard Worker 
setActiveServicesCallback(const std::function<bool (bool)> & activeServicesCallback)271*8222fbe1SAndroid Build Coastguard Worker void LazyServiceRegistrarImpl::setActiveServicesCallback(
272*8222fbe1SAndroid Build Coastguard Worker         const std::function<bool(bool)>& activeServicesCallback) {
273*8222fbe1SAndroid Build Coastguard Worker     mClientCallback->setActiveServicesCallback(activeServicesCallback);
274*8222fbe1SAndroid Build Coastguard Worker }
275*8222fbe1SAndroid Build Coastguard Worker 
276*8222fbe1SAndroid Build Coastguard Worker }  // namespace details
277*8222fbe1SAndroid Build Coastguard Worker 
LazyServiceRegistrar()278*8222fbe1SAndroid Build Coastguard Worker LazyServiceRegistrar::LazyServiceRegistrar() {
279*8222fbe1SAndroid Build Coastguard Worker     mImpl = std::make_shared<details::LazyServiceRegistrarImpl>();
280*8222fbe1SAndroid Build Coastguard Worker }
281*8222fbe1SAndroid Build Coastguard Worker 
getInstance()282*8222fbe1SAndroid Build Coastguard Worker LazyServiceRegistrar& LazyServiceRegistrar::getInstance() {
283*8222fbe1SAndroid Build Coastguard Worker     static auto registrarInstance = new LazyServiceRegistrar();
284*8222fbe1SAndroid Build Coastguard Worker     return *registrarInstance;
285*8222fbe1SAndroid Build Coastguard Worker }
286*8222fbe1SAndroid Build Coastguard Worker 
registerService(const sp<::android::hidl::base::V1_0::IBase> & service,const std::string & name)287*8222fbe1SAndroid Build Coastguard Worker status_t LazyServiceRegistrar::registerService(
288*8222fbe1SAndroid Build Coastguard Worker     const sp<::android::hidl::base::V1_0::IBase>& service, const std::string& name) {
289*8222fbe1SAndroid Build Coastguard Worker     return mImpl->registerService(service, name);
290*8222fbe1SAndroid Build Coastguard Worker }
291*8222fbe1SAndroid Build Coastguard Worker 
tryUnregister()292*8222fbe1SAndroid Build Coastguard Worker bool LazyServiceRegistrar::tryUnregister() {
293*8222fbe1SAndroid Build Coastguard Worker     return mImpl->tryUnregister();
294*8222fbe1SAndroid Build Coastguard Worker }
295*8222fbe1SAndroid Build Coastguard Worker 
reRegister()296*8222fbe1SAndroid Build Coastguard Worker void LazyServiceRegistrar::reRegister() {
297*8222fbe1SAndroid Build Coastguard Worker     mImpl->reRegister();
298*8222fbe1SAndroid Build Coastguard Worker }
299*8222fbe1SAndroid Build Coastguard Worker 
setActiveServicesCallback(const std::function<bool (bool)> & activeServicesCallback)300*8222fbe1SAndroid Build Coastguard Worker void LazyServiceRegistrar::setActiveServicesCallback(
301*8222fbe1SAndroid Build Coastguard Worker         const std::function<bool(bool)>& activeServicesCallback) {
302*8222fbe1SAndroid Build Coastguard Worker     mImpl->setActiveServicesCallback(activeServicesCallback);
303*8222fbe1SAndroid Build Coastguard Worker }
304*8222fbe1SAndroid Build Coastguard Worker 
305*8222fbe1SAndroid Build Coastguard Worker }  // namespace hardware
306*8222fbe1SAndroid Build Coastguard Worker }  // namespace android
307