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