xref: /aosp_15_r20/system/libhwbinder/include/hwbinder/BpHwBinder.h (revision 77b80299c8bdfeca3ae6d0ce27ae1ad3db289be3)
1*77b80299SAndroid Build Coastguard Worker /*
2*77b80299SAndroid Build Coastguard Worker  * Copyright (C) 2005 The Android Open Source Project
3*77b80299SAndroid Build Coastguard Worker  *
4*77b80299SAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*77b80299SAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*77b80299SAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*77b80299SAndroid Build Coastguard Worker  *
8*77b80299SAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*77b80299SAndroid Build Coastguard Worker  *
10*77b80299SAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*77b80299SAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*77b80299SAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*77b80299SAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*77b80299SAndroid Build Coastguard Worker  * limitations under the License.
15*77b80299SAndroid Build Coastguard Worker  */
16*77b80299SAndroid Build Coastguard Worker 
17*77b80299SAndroid Build Coastguard Worker #ifndef ANDROID_HARDWARE_BPHWBINDER_H
18*77b80299SAndroid Build Coastguard Worker #define ANDROID_HARDWARE_BPHWBINDER_H
19*77b80299SAndroid Build Coastguard Worker 
20*77b80299SAndroid Build Coastguard Worker #include <hwbinder/IBinder.h>
21*77b80299SAndroid Build Coastguard Worker #include <utils/KeyedVector.h>
22*77b80299SAndroid Build Coastguard Worker #include <utils/threads.h>
23*77b80299SAndroid Build Coastguard Worker 
24*77b80299SAndroid Build Coastguard Worker // WARNING: this code is part of libhwbinder, a fork of libbinder. Generally,
25*77b80299SAndroid Build Coastguard Worker // this means that it is only relevant to HIDL. Any AIDL- or libbinder-specific
26*77b80299SAndroid Build Coastguard Worker // code should not try to use these things.
27*77b80299SAndroid Build Coastguard Worker 
28*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
29*77b80299SAndroid Build Coastguard Worker namespace android {
30*77b80299SAndroid Build Coastguard Worker namespace hardware {
31*77b80299SAndroid Build Coastguard Worker 
32*77b80299SAndroid Build Coastguard Worker class BpHwBinder : public IBinder
33*77b80299SAndroid Build Coastguard Worker {
34*77b80299SAndroid Build Coastguard Worker public:
35*77b80299SAndroid Build Coastguard Worker                         BpHwBinder(int32_t handle);
36*77b80299SAndroid Build Coastguard Worker 
handle()37*77b80299SAndroid Build Coastguard Worker     inline  int32_t     handle() const { return mHandle; }
38*77b80299SAndroid Build Coastguard Worker 
39*77b80299SAndroid Build Coastguard Worker     virtual status_t    transact(   uint32_t code,
40*77b80299SAndroid Build Coastguard Worker                                     const Parcel& data,
41*77b80299SAndroid Build Coastguard Worker                                     Parcel* reply,
42*77b80299SAndroid Build Coastguard Worker                                     uint32_t flags = 0,
43*77b80299SAndroid Build Coastguard Worker                                     TransactCallback callback = nullptr);
44*77b80299SAndroid Build Coastguard Worker 
45*77b80299SAndroid Build Coastguard Worker     virtual status_t    linkToDeath(const sp<DeathRecipient>& recipient,
46*77b80299SAndroid Build Coastguard Worker                                     void* cookie = nullptr,
47*77b80299SAndroid Build Coastguard Worker                                     uint32_t flags = 0);
48*77b80299SAndroid Build Coastguard Worker     virtual status_t    unlinkToDeath(  const wp<DeathRecipient>& recipient,
49*77b80299SAndroid Build Coastguard Worker                                         void* cookie = nullptr,
50*77b80299SAndroid Build Coastguard Worker                                         uint32_t flags = 0,
51*77b80299SAndroid Build Coastguard Worker                                         wp<DeathRecipient>* outRecipient = nullptr);
52*77b80299SAndroid Build Coastguard Worker 
53*77b80299SAndroid Build Coastguard Worker     virtual void        attachObject(   const void* objectID,
54*77b80299SAndroid Build Coastguard Worker                                         void* object,
55*77b80299SAndroid Build Coastguard Worker                                         void* cleanupCookie,
56*77b80299SAndroid Build Coastguard Worker                                         object_cleanup_func func);
57*77b80299SAndroid Build Coastguard Worker     virtual void*       findObject(const void* objectID) const;
58*77b80299SAndroid Build Coastguard Worker     virtual void        detachObject(const void* objectID);
59*77b80299SAndroid Build Coastguard Worker 
60*77b80299SAndroid Build Coastguard Worker     virtual BpHwBinder*   remoteBinder();
61*77b80299SAndroid Build Coastguard Worker 
62*77b80299SAndroid Build Coastguard Worker             void        sendObituary();
63*77b80299SAndroid Build Coastguard Worker                         // This refcount includes:
64*77b80299SAndroid Build Coastguard Worker                         // 1. Strong references to the node by this and other processes
65*77b80299SAndroid Build Coastguard Worker                         // 2. Temporary strong references held by the kernel during a
66*77b80299SAndroid Build Coastguard Worker                         //    transaction on the node.
67*77b80299SAndroid Build Coastguard Worker                         // It does NOT include local strong references to the node
68*77b80299SAndroid Build Coastguard Worker             ssize_t     getNodeStrongRefCount();
69*77b80299SAndroid Build Coastguard Worker     class ObjectManager
70*77b80299SAndroid Build Coastguard Worker     {
71*77b80299SAndroid Build Coastguard Worker     public:
72*77b80299SAndroid Build Coastguard Worker                     ObjectManager();
73*77b80299SAndroid Build Coastguard Worker                     ~ObjectManager();
74*77b80299SAndroid Build Coastguard Worker 
75*77b80299SAndroid Build Coastguard Worker         void        attach( const void* objectID,
76*77b80299SAndroid Build Coastguard Worker                             void* object,
77*77b80299SAndroid Build Coastguard Worker                             void* cleanupCookie,
78*77b80299SAndroid Build Coastguard Worker                             IBinder::object_cleanup_func func);
79*77b80299SAndroid Build Coastguard Worker         void*       find(const void* objectID) const;
80*77b80299SAndroid Build Coastguard Worker         void        detach(const void* objectID);
81*77b80299SAndroid Build Coastguard Worker 
82*77b80299SAndroid Build Coastguard Worker         void        kill();
83*77b80299SAndroid Build Coastguard Worker 
84*77b80299SAndroid Build Coastguard Worker     private:
85*77b80299SAndroid Build Coastguard Worker                     ObjectManager(const ObjectManager&);
86*77b80299SAndroid Build Coastguard Worker         ObjectManager& operator=(const ObjectManager&);
87*77b80299SAndroid Build Coastguard Worker 
88*77b80299SAndroid Build Coastguard Worker         struct entry_t
89*77b80299SAndroid Build Coastguard Worker         {
90*77b80299SAndroid Build Coastguard Worker             void* object;
91*77b80299SAndroid Build Coastguard Worker             void* cleanupCookie;
92*77b80299SAndroid Build Coastguard Worker             IBinder::object_cleanup_func func;
93*77b80299SAndroid Build Coastguard Worker         };
94*77b80299SAndroid Build Coastguard Worker 
95*77b80299SAndroid Build Coastguard Worker         KeyedVector<const void*, entry_t> mObjects;
96*77b80299SAndroid Build Coastguard Worker     };
97*77b80299SAndroid Build Coastguard Worker 
98*77b80299SAndroid Build Coastguard Worker protected:
99*77b80299SAndroid Build Coastguard Worker     virtual             ~BpHwBinder();
100*77b80299SAndroid Build Coastguard Worker     virtual void        onFirstRef();
101*77b80299SAndroid Build Coastguard Worker     virtual void        onLastStrongRef(const void* id);
102*77b80299SAndroid Build Coastguard Worker     virtual bool        onIncStrongAttempted(uint32_t flags, const void* id);
103*77b80299SAndroid Build Coastguard Worker 
104*77b80299SAndroid Build Coastguard Worker private:
105*77b80299SAndroid Build Coastguard Worker     const   int32_t             mHandle;
106*77b80299SAndroid Build Coastguard Worker 
107*77b80299SAndroid Build Coastguard Worker     struct Obituary {
108*77b80299SAndroid Build Coastguard Worker         wp<DeathRecipient> recipient;
109*77b80299SAndroid Build Coastguard Worker         void* cookie;
110*77b80299SAndroid Build Coastguard Worker         uint32_t flags;
111*77b80299SAndroid Build Coastguard Worker     };
112*77b80299SAndroid Build Coastguard Worker 
113*77b80299SAndroid Build Coastguard Worker             void                reportOneDeath(const Obituary& obit);
114*77b80299SAndroid Build Coastguard Worker             bool                isDescriptorCached() const;
115*77b80299SAndroid Build Coastguard Worker 
116*77b80299SAndroid Build Coastguard Worker     mutable Mutex               mLock;
117*77b80299SAndroid Build Coastguard Worker             volatile int32_t    mAlive;
118*77b80299SAndroid Build Coastguard Worker             volatile int32_t    mObitsSent;
119*77b80299SAndroid Build Coastguard Worker             Vector<Obituary>*   mObituaries;
120*77b80299SAndroid Build Coastguard Worker             ObjectManager       mObjects;
121*77b80299SAndroid Build Coastguard Worker     mutable String16            mDescriptorCache;
122*77b80299SAndroid Build Coastguard Worker };
123*77b80299SAndroid Build Coastguard Worker 
124*77b80299SAndroid Build Coastguard Worker } // namespace hardware
125*77b80299SAndroid Build Coastguard Worker } // namespace android
126*77b80299SAndroid Build Coastguard Worker 
127*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
128*77b80299SAndroid Build Coastguard Worker 
129*77b80299SAndroid Build Coastguard Worker #endif // ANDROID_HARDWARE_BPHWBINDER_H
130