xref: /aosp_15_r20/system/libhidl/transport/include/hidl/HidlLazyUtils.h (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 #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