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 #pragma once 18*8222fbe1SAndroid Build Coastguard Worker 19*8222fbe1SAndroid Build Coastguard Worker #include <functional> 20*8222fbe1SAndroid Build Coastguard Worker 21*8222fbe1SAndroid Build Coastguard Worker #include <android/hidl/base/1.0/IBase.h> 22*8222fbe1SAndroid Build Coastguard Worker #include <utils/RefBase.h> 23*8222fbe1SAndroid Build Coastguard Worker #include <utils/StrongPointer.h> 24*8222fbe1SAndroid Build Coastguard Worker 25*8222fbe1SAndroid Build Coastguard Worker namespace android { 26*8222fbe1SAndroid Build Coastguard Worker namespace hardware { 27*8222fbe1SAndroid Build Coastguard Worker namespace details { 28*8222fbe1SAndroid Build Coastguard Worker class LazyServiceRegistrarImpl; 29*8222fbe1SAndroid Build Coastguard Worker } // namespace details 30*8222fbe1SAndroid Build Coastguard Worker 31*8222fbe1SAndroid Build Coastguard Worker /** 32*8222fbe1SAndroid Build Coastguard Worker * Exits when all HALs registered through this object have 0 clients 33*8222fbe1SAndroid Build Coastguard Worker * 34*8222fbe1SAndroid Build Coastguard Worker * In order to use this class, it's expected that your service: 35*8222fbe1SAndroid Build Coastguard Worker * - registers all services in the process with this API 36*8222fbe1SAndroid Build Coastguard Worker * - configures services as oneshot + disabled in init .rc files 37*8222fbe1SAndroid Build Coastguard Worker * - uses 'interface' declarations in init .rc files 38*8222fbe1SAndroid Build Coastguard Worker * 39*8222fbe1SAndroid Build Coastguard Worker * For more information on init .rc configuration, see system/core/init/README.md 40*8222fbe1SAndroid Build Coastguard Worker **/ 41*8222fbe1SAndroid Build Coastguard Worker class LazyServiceRegistrar { 42*8222fbe1SAndroid Build Coastguard Worker public: 43*8222fbe1SAndroid Build Coastguard Worker static LazyServiceRegistrar& getInstance(); 44*8222fbe1SAndroid Build Coastguard Worker status_t registerService(const sp<::android::hidl::base::V1_0::IBase>& service, 45*8222fbe1SAndroid Build Coastguard Worker const std::string& name = "default"); 46*8222fbe1SAndroid Build Coastguard Worker /** 47*8222fbe1SAndroid Build Coastguard Worker * Set a callback that is invoked when the active HAL count (i.e. HALs with clients) 48*8222fbe1SAndroid Build Coastguard Worker * registered with this process drops to zero (or becomes nonzero). 49*8222fbe1SAndroid Build Coastguard Worker * The callback takes a boolean argument, which is 'true' if there is 50*8222fbe1SAndroid Build Coastguard Worker * at least one HAL with clients. 51*8222fbe1SAndroid Build Coastguard Worker * 52*8222fbe1SAndroid Build Coastguard Worker * Callback return value: 53*8222fbe1SAndroid Build Coastguard Worker * - false: Default behavior for lazy HALs (shut down the process if there 54*8222fbe1SAndroid Build Coastguard Worker * are no clients). 55*8222fbe1SAndroid Build Coastguard Worker * - true: Don't shut down the process even if there are no clients. 56*8222fbe1SAndroid Build Coastguard Worker * 57*8222fbe1SAndroid Build Coastguard Worker * This callback gives a chance to: 58*8222fbe1SAndroid Build Coastguard Worker * 1 - Perform some additional operations before exiting; 59*8222fbe1SAndroid Build Coastguard Worker * 2 - Prevent the process from exiting by returning "true" from the 60*8222fbe1SAndroid Build Coastguard Worker * callback. 61*8222fbe1SAndroid Build Coastguard Worker * 62*8222fbe1SAndroid Build Coastguard Worker * This method should be called before 'registerService' to avoid races. 63*8222fbe1SAndroid Build Coastguard Worker */ 64*8222fbe1SAndroid Build Coastguard Worker void setActiveServicesCallback(const std::function<bool(bool)>& activeServicesCallback); 65*8222fbe1SAndroid Build Coastguard Worker 66*8222fbe1SAndroid Build Coastguard Worker /** 67*8222fbe1SAndroid Build Coastguard Worker * Try to unregister all services previously registered with 'registerService'. 68*8222fbe1SAndroid Build Coastguard Worker * Returns 'true' if successful. This should only be called within 69*8222fbe1SAndroid Build Coastguard Worker * the callback registered by setActiveServicesCallback. 70*8222fbe1SAndroid Build Coastguard Worker */ 71*8222fbe1SAndroid Build Coastguard Worker bool tryUnregister(); 72*8222fbe1SAndroid Build Coastguard Worker 73*8222fbe1SAndroid Build Coastguard Worker /** 74*8222fbe1SAndroid Build Coastguard Worker * Re-register services that were unregistered by 'tryUnregister'. 75*8222fbe1SAndroid Build Coastguard Worker * This method should be called in the case 'tryUnregister' fails 76*8222fbe1SAndroid Build Coastguard Worker * (and should be called on the same thread). 77*8222fbe1SAndroid Build Coastguard Worker */ 78*8222fbe1SAndroid Build Coastguard Worker void reRegister(); 79*8222fbe1SAndroid Build Coastguard Worker 80*8222fbe1SAndroid Build Coastguard Worker private: 81*8222fbe1SAndroid Build Coastguard Worker std::shared_ptr<details::LazyServiceRegistrarImpl> mImpl; 82*8222fbe1SAndroid Build Coastguard Worker LazyServiceRegistrar(); 83*8222fbe1SAndroid Build Coastguard Worker }; 84*8222fbe1SAndroid Build Coastguard Worker 85*8222fbe1SAndroid Build Coastguard Worker } // namespace hardware 86*8222fbe1SAndroid Build Coastguard Worker } // namespace android 87