xref: /aosp_15_r20/system/libhwbinder/BpHwBinder.cpp (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 #define LOG_TAG "hw-BpHwBinder"
18*77b80299SAndroid Build Coastguard Worker //#define LOG_NDEBUG 0
19*77b80299SAndroid Build Coastguard Worker 
20*77b80299SAndroid Build Coastguard Worker #include <hwbinder/BpHwBinder.h>
21*77b80299SAndroid Build Coastguard Worker 
22*77b80299SAndroid Build Coastguard Worker #include <hwbinder/IPCThreadState.h>
23*77b80299SAndroid Build Coastguard Worker #include <utils/Log.h>
24*77b80299SAndroid Build Coastguard Worker 
25*77b80299SAndroid Build Coastguard Worker #include <stdio.h>
26*77b80299SAndroid Build Coastguard Worker 
27*77b80299SAndroid Build Coastguard Worker //#undef ALOGV
28*77b80299SAndroid Build Coastguard Worker //#define ALOGV(...) fprintf(stderr, __VA_ARGS__)
29*77b80299SAndroid Build Coastguard Worker 
30*77b80299SAndroid Build Coastguard Worker namespace android {
31*77b80299SAndroid Build Coastguard Worker namespace hardware {
32*77b80299SAndroid Build Coastguard Worker 
33*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
34*77b80299SAndroid Build Coastguard Worker 
ObjectManager()35*77b80299SAndroid Build Coastguard Worker BpHwBinder::ObjectManager::ObjectManager()
36*77b80299SAndroid Build Coastguard Worker {
37*77b80299SAndroid Build Coastguard Worker }
38*77b80299SAndroid Build Coastguard Worker 
~ObjectManager()39*77b80299SAndroid Build Coastguard Worker BpHwBinder::ObjectManager::~ObjectManager()
40*77b80299SAndroid Build Coastguard Worker {
41*77b80299SAndroid Build Coastguard Worker     kill();
42*77b80299SAndroid Build Coastguard Worker }
43*77b80299SAndroid Build Coastguard Worker 
attach(const void * objectID,void * object,void * cleanupCookie,IBinder::object_cleanup_func func)44*77b80299SAndroid Build Coastguard Worker void BpHwBinder::ObjectManager::attach(
45*77b80299SAndroid Build Coastguard Worker     const void* objectID, void* object, void* cleanupCookie,
46*77b80299SAndroid Build Coastguard Worker     IBinder::object_cleanup_func func)
47*77b80299SAndroid Build Coastguard Worker {
48*77b80299SAndroid Build Coastguard Worker     entry_t e;
49*77b80299SAndroid Build Coastguard Worker     e.object = object;
50*77b80299SAndroid Build Coastguard Worker     e.cleanupCookie = cleanupCookie;
51*77b80299SAndroid Build Coastguard Worker     e.func = func;
52*77b80299SAndroid Build Coastguard Worker 
53*77b80299SAndroid Build Coastguard Worker     if (mObjects.indexOfKey(objectID) >= 0) {
54*77b80299SAndroid Build Coastguard Worker         ALOGE("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object ID already in use",
55*77b80299SAndroid Build Coastguard Worker                 objectID, this,  object);
56*77b80299SAndroid Build Coastguard Worker         return;
57*77b80299SAndroid Build Coastguard Worker     }
58*77b80299SAndroid Build Coastguard Worker 
59*77b80299SAndroid Build Coastguard Worker     mObjects.add(objectID, e);
60*77b80299SAndroid Build Coastguard Worker }
61*77b80299SAndroid Build Coastguard Worker 
find(const void * objectID) const62*77b80299SAndroid Build Coastguard Worker void* BpHwBinder::ObjectManager::find(const void* objectID) const
63*77b80299SAndroid Build Coastguard Worker {
64*77b80299SAndroid Build Coastguard Worker     const ssize_t i = mObjects.indexOfKey(objectID);
65*77b80299SAndroid Build Coastguard Worker     if (i < 0) return nullptr;
66*77b80299SAndroid Build Coastguard Worker     return mObjects.valueAt(i).object;
67*77b80299SAndroid Build Coastguard Worker }
68*77b80299SAndroid Build Coastguard Worker 
detach(const void * objectID)69*77b80299SAndroid Build Coastguard Worker void BpHwBinder::ObjectManager::detach(const void* objectID)
70*77b80299SAndroid Build Coastguard Worker {
71*77b80299SAndroid Build Coastguard Worker     mObjects.removeItem(objectID);
72*77b80299SAndroid Build Coastguard Worker }
73*77b80299SAndroid Build Coastguard Worker 
kill()74*77b80299SAndroid Build Coastguard Worker void BpHwBinder::ObjectManager::kill()
75*77b80299SAndroid Build Coastguard Worker {
76*77b80299SAndroid Build Coastguard Worker     const size_t N = mObjects.size();
77*77b80299SAndroid Build Coastguard Worker     ALOGV("Killing %zu objects in manager %p", N, this);
78*77b80299SAndroid Build Coastguard Worker     for (size_t i=0; i<N; i++) {
79*77b80299SAndroid Build Coastguard Worker         const entry_t& e = mObjects.valueAt(i);
80*77b80299SAndroid Build Coastguard Worker         if (e.func != nullptr) {
81*77b80299SAndroid Build Coastguard Worker             e.func(mObjects.keyAt(i), e.object, e.cleanupCookie);
82*77b80299SAndroid Build Coastguard Worker         }
83*77b80299SAndroid Build Coastguard Worker     }
84*77b80299SAndroid Build Coastguard Worker 
85*77b80299SAndroid Build Coastguard Worker     mObjects.clear();
86*77b80299SAndroid Build Coastguard Worker }
87*77b80299SAndroid Build Coastguard Worker 
88*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
89*77b80299SAndroid Build Coastguard Worker 
BpHwBinder(int32_t handle)90*77b80299SAndroid Build Coastguard Worker BpHwBinder::BpHwBinder(int32_t handle)
91*77b80299SAndroid Build Coastguard Worker     : mHandle(handle)
92*77b80299SAndroid Build Coastguard Worker     , mAlive(1)
93*77b80299SAndroid Build Coastguard Worker     , mObitsSent(0)
94*77b80299SAndroid Build Coastguard Worker     , mObituaries(nullptr)
95*77b80299SAndroid Build Coastguard Worker {
96*77b80299SAndroid Build Coastguard Worker     ALOGV("Creating BpHwBinder %p handle %d\n", this, mHandle);
97*77b80299SAndroid Build Coastguard Worker 
98*77b80299SAndroid Build Coastguard Worker     extendObjectLifetime(OBJECT_LIFETIME_WEAK);
99*77b80299SAndroid Build Coastguard Worker     IPCThreadState::self()->incWeakHandle(handle, this);
100*77b80299SAndroid Build Coastguard Worker }
101*77b80299SAndroid Build Coastguard Worker 
transact(uint32_t code,const Parcel & data,Parcel * reply,uint32_t flags,TransactCallback callback)102*77b80299SAndroid Build Coastguard Worker status_t BpHwBinder::transact(
103*77b80299SAndroid Build Coastguard Worker     uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags, TransactCallback callback)
104*77b80299SAndroid Build Coastguard Worker {
105*77b80299SAndroid Build Coastguard Worker     // Once a binder has died, it will never come back to life.
106*77b80299SAndroid Build Coastguard Worker     if (mAlive) {
107*77b80299SAndroid Build Coastguard Worker         status_t status = IPCThreadState::self()->transact(
108*77b80299SAndroid Build Coastguard Worker             mHandle, code, data, reply, flags);
109*77b80299SAndroid Build Coastguard Worker 
110*77b80299SAndroid Build Coastguard Worker         if (status == ::android::OK && callback != nullptr) {
111*77b80299SAndroid Build Coastguard Worker             callback(*reply);
112*77b80299SAndroid Build Coastguard Worker         }
113*77b80299SAndroid Build Coastguard Worker 
114*77b80299SAndroid Build Coastguard Worker         if (status == DEAD_OBJECT) mAlive = 0;
115*77b80299SAndroid Build Coastguard Worker         return status;
116*77b80299SAndroid Build Coastguard Worker     }
117*77b80299SAndroid Build Coastguard Worker 
118*77b80299SAndroid Build Coastguard Worker     return DEAD_OBJECT;
119*77b80299SAndroid Build Coastguard Worker }
120*77b80299SAndroid Build Coastguard Worker 
linkToDeath(const sp<DeathRecipient> & recipient,void * cookie,uint32_t flags)121*77b80299SAndroid Build Coastguard Worker status_t BpHwBinder::linkToDeath(
122*77b80299SAndroid Build Coastguard Worker     const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags)
123*77b80299SAndroid Build Coastguard Worker {
124*77b80299SAndroid Build Coastguard Worker     Obituary ob;
125*77b80299SAndroid Build Coastguard Worker     ob.recipient = recipient;
126*77b80299SAndroid Build Coastguard Worker     ob.cookie = cookie;
127*77b80299SAndroid Build Coastguard Worker     ob.flags = flags;
128*77b80299SAndroid Build Coastguard Worker 
129*77b80299SAndroid Build Coastguard Worker     LOG_ALWAYS_FATAL_IF(recipient == nullptr,
130*77b80299SAndroid Build Coastguard Worker                         "linkToDeath(): recipient must be non-NULL");
131*77b80299SAndroid Build Coastguard Worker 
132*77b80299SAndroid Build Coastguard Worker     {
133*77b80299SAndroid Build Coastguard Worker         AutoMutex _l(mLock);
134*77b80299SAndroid Build Coastguard Worker 
135*77b80299SAndroid Build Coastguard Worker         if (!mObitsSent) {
136*77b80299SAndroid Build Coastguard Worker             if (!mObituaries) {
137*77b80299SAndroid Build Coastguard Worker                 mObituaries = new Vector<Obituary>;
138*77b80299SAndroid Build Coastguard Worker                 if (!mObituaries) {
139*77b80299SAndroid Build Coastguard Worker                     return NO_MEMORY;
140*77b80299SAndroid Build Coastguard Worker                 }
141*77b80299SAndroid Build Coastguard Worker                 ALOGV("Requesting death notification: %p handle %d\n", this, mHandle);
142*77b80299SAndroid Build Coastguard Worker                 getWeakRefs()->incWeak(this);
143*77b80299SAndroid Build Coastguard Worker                 IPCThreadState* self = IPCThreadState::self();
144*77b80299SAndroid Build Coastguard Worker                 self->requestDeathNotification(mHandle, this);
145*77b80299SAndroid Build Coastguard Worker                 self->flushCommands();
146*77b80299SAndroid Build Coastguard Worker             }
147*77b80299SAndroid Build Coastguard Worker             ssize_t res = mObituaries->add(ob);
148*77b80299SAndroid Build Coastguard Worker             return res >= (ssize_t)NO_ERROR ? (status_t)NO_ERROR : res;
149*77b80299SAndroid Build Coastguard Worker         }
150*77b80299SAndroid Build Coastguard Worker     }
151*77b80299SAndroid Build Coastguard Worker 
152*77b80299SAndroid Build Coastguard Worker     return DEAD_OBJECT;
153*77b80299SAndroid Build Coastguard Worker }
154*77b80299SAndroid Build Coastguard Worker 
unlinkToDeath(const wp<DeathRecipient> & recipient,void * cookie,uint32_t flags,wp<DeathRecipient> * outRecipient)155*77b80299SAndroid Build Coastguard Worker status_t BpHwBinder::unlinkToDeath(
156*77b80299SAndroid Build Coastguard Worker     const wp<DeathRecipient>& recipient, void* cookie, uint32_t flags,
157*77b80299SAndroid Build Coastguard Worker     wp<DeathRecipient>* outRecipient)
158*77b80299SAndroid Build Coastguard Worker {
159*77b80299SAndroid Build Coastguard Worker     AutoMutex _l(mLock);
160*77b80299SAndroid Build Coastguard Worker 
161*77b80299SAndroid Build Coastguard Worker     if (mObitsSent) {
162*77b80299SAndroid Build Coastguard Worker         return DEAD_OBJECT;
163*77b80299SAndroid Build Coastguard Worker     }
164*77b80299SAndroid Build Coastguard Worker 
165*77b80299SAndroid Build Coastguard Worker     const size_t N = mObituaries ? mObituaries->size() : 0;
166*77b80299SAndroid Build Coastguard Worker     for (size_t i=0; i<N; i++) {
167*77b80299SAndroid Build Coastguard Worker         const Obituary& obit = mObituaries->itemAt(i);
168*77b80299SAndroid Build Coastguard Worker         if ((obit.recipient == recipient
169*77b80299SAndroid Build Coastguard Worker                     || (recipient == nullptr && obit.cookie == cookie))
170*77b80299SAndroid Build Coastguard Worker                 && obit.flags == flags) {
171*77b80299SAndroid Build Coastguard Worker             if (outRecipient != nullptr) {
172*77b80299SAndroid Build Coastguard Worker                 *outRecipient = mObituaries->itemAt(i).recipient;
173*77b80299SAndroid Build Coastguard Worker             }
174*77b80299SAndroid Build Coastguard Worker             mObituaries->removeAt(i);
175*77b80299SAndroid Build Coastguard Worker             if (mObituaries->size() == 0) {
176*77b80299SAndroid Build Coastguard Worker                 ALOGV("Clearing death notification: %p handle %d\n", this, mHandle);
177*77b80299SAndroid Build Coastguard Worker                 IPCThreadState* self = IPCThreadState::self();
178*77b80299SAndroid Build Coastguard Worker                 self->clearDeathNotification(mHandle, this);
179*77b80299SAndroid Build Coastguard Worker                 self->flushCommands();
180*77b80299SAndroid Build Coastguard Worker                 delete mObituaries;
181*77b80299SAndroid Build Coastguard Worker                 mObituaries = nullptr;
182*77b80299SAndroid Build Coastguard Worker             }
183*77b80299SAndroid Build Coastguard Worker             return NO_ERROR;
184*77b80299SAndroid Build Coastguard Worker         }
185*77b80299SAndroid Build Coastguard Worker     }
186*77b80299SAndroid Build Coastguard Worker 
187*77b80299SAndroid Build Coastguard Worker     return NAME_NOT_FOUND;
188*77b80299SAndroid Build Coastguard Worker }
189*77b80299SAndroid Build Coastguard Worker 
sendObituary()190*77b80299SAndroid Build Coastguard Worker void BpHwBinder::sendObituary()
191*77b80299SAndroid Build Coastguard Worker {
192*77b80299SAndroid Build Coastguard Worker     ALOGV("Sending obituary for proxy %p handle %d, mObitsSent=%s\n",
193*77b80299SAndroid Build Coastguard Worker         this, mHandle, mObitsSent ? "true" : "false");
194*77b80299SAndroid Build Coastguard Worker 
195*77b80299SAndroid Build Coastguard Worker     mAlive = 0;
196*77b80299SAndroid Build Coastguard Worker     if (mObitsSent) return;
197*77b80299SAndroid Build Coastguard Worker 
198*77b80299SAndroid Build Coastguard Worker     mLock.lock();
199*77b80299SAndroid Build Coastguard Worker     Vector<Obituary>* obits = mObituaries;
200*77b80299SAndroid Build Coastguard Worker     if(obits != nullptr) {
201*77b80299SAndroid Build Coastguard Worker         ALOGV("Clearing sent death notification: %p handle %d\n", this, mHandle);
202*77b80299SAndroid Build Coastguard Worker         IPCThreadState* self = IPCThreadState::self();
203*77b80299SAndroid Build Coastguard Worker         self->clearDeathNotification(mHandle, this);
204*77b80299SAndroid Build Coastguard Worker         self->flushCommands();
205*77b80299SAndroid Build Coastguard Worker         mObituaries = nullptr;
206*77b80299SAndroid Build Coastguard Worker     }
207*77b80299SAndroid Build Coastguard Worker     mObitsSent = 1;
208*77b80299SAndroid Build Coastguard Worker     mLock.unlock();
209*77b80299SAndroid Build Coastguard Worker 
210*77b80299SAndroid Build Coastguard Worker     ALOGV("Reporting death of proxy %p for %zu recipients\n",
211*77b80299SAndroid Build Coastguard Worker         this, obits ? obits->size() : 0U);
212*77b80299SAndroid Build Coastguard Worker 
213*77b80299SAndroid Build Coastguard Worker     if (obits != nullptr) {
214*77b80299SAndroid Build Coastguard Worker         const size_t N = obits->size();
215*77b80299SAndroid Build Coastguard Worker         for (size_t i=0; i<N; i++) {
216*77b80299SAndroid Build Coastguard Worker             reportOneDeath(obits->itemAt(i));
217*77b80299SAndroid Build Coastguard Worker         }
218*77b80299SAndroid Build Coastguard Worker 
219*77b80299SAndroid Build Coastguard Worker         delete obits;
220*77b80299SAndroid Build Coastguard Worker     }
221*77b80299SAndroid Build Coastguard Worker }
222*77b80299SAndroid Build Coastguard Worker 
223*77b80299SAndroid Build Coastguard Worker // Returns the strong refcount on the object this proxy points to, or
224*77b80299SAndroid Build Coastguard Worker // -1 in case of failure.
getNodeStrongRefCount()225*77b80299SAndroid Build Coastguard Worker ssize_t BpHwBinder::getNodeStrongRefCount()
226*77b80299SAndroid Build Coastguard Worker {
227*77b80299SAndroid Build Coastguard Worker     return ProcessState::self()->getStrongRefCountForNodeByHandle(mHandle);
228*77b80299SAndroid Build Coastguard Worker }
229*77b80299SAndroid Build Coastguard Worker 
reportOneDeath(const Obituary & obit)230*77b80299SAndroid Build Coastguard Worker void BpHwBinder::reportOneDeath(const Obituary& obit)
231*77b80299SAndroid Build Coastguard Worker {
232*77b80299SAndroid Build Coastguard Worker     sp<DeathRecipient> recipient = obit.recipient.promote();
233*77b80299SAndroid Build Coastguard Worker     ALOGV("Reporting death to recipient: %p\n", recipient.get());
234*77b80299SAndroid Build Coastguard Worker     if (recipient == nullptr) return;
235*77b80299SAndroid Build Coastguard Worker 
236*77b80299SAndroid Build Coastguard Worker     recipient->binderDied(this);
237*77b80299SAndroid Build Coastguard Worker }
238*77b80299SAndroid Build Coastguard Worker 
239*77b80299SAndroid Build Coastguard Worker 
attachObject(const void * objectID,void * object,void * cleanupCookie,object_cleanup_func func)240*77b80299SAndroid Build Coastguard Worker void BpHwBinder::attachObject(
241*77b80299SAndroid Build Coastguard Worker     const void* objectID, void* object, void* cleanupCookie,
242*77b80299SAndroid Build Coastguard Worker     object_cleanup_func func)
243*77b80299SAndroid Build Coastguard Worker {
244*77b80299SAndroid Build Coastguard Worker     AutoMutex _l(mLock);
245*77b80299SAndroid Build Coastguard Worker     ALOGV("Attaching object %p to binder %p (manager=%p)", object, this, &mObjects);
246*77b80299SAndroid Build Coastguard Worker     mObjects.attach(objectID, object, cleanupCookie, func);
247*77b80299SAndroid Build Coastguard Worker }
248*77b80299SAndroid Build Coastguard Worker 
findObject(const void * objectID) const249*77b80299SAndroid Build Coastguard Worker void* BpHwBinder::findObject(const void* objectID) const
250*77b80299SAndroid Build Coastguard Worker {
251*77b80299SAndroid Build Coastguard Worker     AutoMutex _l(mLock);
252*77b80299SAndroid Build Coastguard Worker     return mObjects.find(objectID);
253*77b80299SAndroid Build Coastguard Worker }
254*77b80299SAndroid Build Coastguard Worker 
detachObject(const void * objectID)255*77b80299SAndroid Build Coastguard Worker void BpHwBinder::detachObject(const void* objectID)
256*77b80299SAndroid Build Coastguard Worker {
257*77b80299SAndroid Build Coastguard Worker     AutoMutex _l(mLock);
258*77b80299SAndroid Build Coastguard Worker     mObjects.detach(objectID);
259*77b80299SAndroid Build Coastguard Worker }
260*77b80299SAndroid Build Coastguard Worker 
remoteBinder()261*77b80299SAndroid Build Coastguard Worker BpHwBinder* BpHwBinder::remoteBinder()
262*77b80299SAndroid Build Coastguard Worker {
263*77b80299SAndroid Build Coastguard Worker     return this;
264*77b80299SAndroid Build Coastguard Worker }
265*77b80299SAndroid Build Coastguard Worker 
~BpHwBinder()266*77b80299SAndroid Build Coastguard Worker BpHwBinder::~BpHwBinder()
267*77b80299SAndroid Build Coastguard Worker {
268*77b80299SAndroid Build Coastguard Worker     ALOGV("Destroying BpHwBinder %p handle %d\n", this, mHandle);
269*77b80299SAndroid Build Coastguard Worker 
270*77b80299SAndroid Build Coastguard Worker     IPCThreadState* ipc = IPCThreadState::self();
271*77b80299SAndroid Build Coastguard Worker 
272*77b80299SAndroid Build Coastguard Worker     if (ipc) {
273*77b80299SAndroid Build Coastguard Worker         ipc->expungeHandle(mHandle, this);
274*77b80299SAndroid Build Coastguard Worker         ipc->decWeakHandle(mHandle);
275*77b80299SAndroid Build Coastguard Worker     }
276*77b80299SAndroid Build Coastguard Worker }
277*77b80299SAndroid Build Coastguard Worker 
onFirstRef()278*77b80299SAndroid Build Coastguard Worker void BpHwBinder::onFirstRef()
279*77b80299SAndroid Build Coastguard Worker {
280*77b80299SAndroid Build Coastguard Worker     ALOGV("onFirstRef BpHwBinder %p handle %d\n", this, mHandle);
281*77b80299SAndroid Build Coastguard Worker     IPCThreadState* ipc = IPCThreadState::self();
282*77b80299SAndroid Build Coastguard Worker     if (ipc) ipc->incStrongHandle(mHandle, this);
283*77b80299SAndroid Build Coastguard Worker }
284*77b80299SAndroid Build Coastguard Worker 
onLastStrongRef(const void *)285*77b80299SAndroid Build Coastguard Worker void BpHwBinder::onLastStrongRef(const void* /*id*/)
286*77b80299SAndroid Build Coastguard Worker {
287*77b80299SAndroid Build Coastguard Worker     ALOGV("onLastStrongRef BpHwBinder %p handle %d\n", this, mHandle);
288*77b80299SAndroid Build Coastguard Worker     IF_ALOGV() {
289*77b80299SAndroid Build Coastguard Worker         printRefs();
290*77b80299SAndroid Build Coastguard Worker     }
291*77b80299SAndroid Build Coastguard Worker     IPCThreadState* ipc = IPCThreadState::self();
292*77b80299SAndroid Build Coastguard Worker     if (ipc) {
293*77b80299SAndroid Build Coastguard Worker         ipc->decStrongHandle(mHandle);
294*77b80299SAndroid Build Coastguard Worker         ipc->flushCommands();
295*77b80299SAndroid Build Coastguard Worker     }
296*77b80299SAndroid Build Coastguard Worker 
297*77b80299SAndroid Build Coastguard Worker     mLock.lock();
298*77b80299SAndroid Build Coastguard Worker     Vector<Obituary>* obits = mObituaries;
299*77b80299SAndroid Build Coastguard Worker     if(obits != nullptr) {
300*77b80299SAndroid Build Coastguard Worker         if (!obits->isEmpty()) {
301*77b80299SAndroid Build Coastguard Worker             ALOGI("onLastStrongRef automatically unlinking death recipients");
302*77b80299SAndroid Build Coastguard Worker         }
303*77b80299SAndroid Build Coastguard Worker 
304*77b80299SAndroid Build Coastguard Worker         if (ipc) ipc->clearDeathNotification(mHandle, this);
305*77b80299SAndroid Build Coastguard Worker         mObituaries = nullptr;
306*77b80299SAndroid Build Coastguard Worker     }
307*77b80299SAndroid Build Coastguard Worker     mLock.unlock();
308*77b80299SAndroid Build Coastguard Worker 
309*77b80299SAndroid Build Coastguard Worker     if (obits != nullptr) {
310*77b80299SAndroid Build Coastguard Worker         // XXX Should we tell any remaining DeathRecipient
311*77b80299SAndroid Build Coastguard Worker         // objects that the last strong ref has gone away, so they
312*77b80299SAndroid Build Coastguard Worker         // are no longer linked?
313*77b80299SAndroid Build Coastguard Worker         delete obits;
314*77b80299SAndroid Build Coastguard Worker         obits = nullptr;
315*77b80299SAndroid Build Coastguard Worker     }
316*77b80299SAndroid Build Coastguard Worker }
317*77b80299SAndroid Build Coastguard Worker 
onIncStrongAttempted(uint32_t,const void *)318*77b80299SAndroid Build Coastguard Worker bool BpHwBinder::onIncStrongAttempted(uint32_t /*flags*/, const void* /*id*/)
319*77b80299SAndroid Build Coastguard Worker {
320*77b80299SAndroid Build Coastguard Worker     ALOGV("onIncStrongAttempted BpHwBinder %p handle %d\n", this, mHandle);
321*77b80299SAndroid Build Coastguard Worker     IPCThreadState* ipc = IPCThreadState::self();
322*77b80299SAndroid Build Coastguard Worker     return ipc ? ipc->attemptIncStrongHandle(mHandle) == NO_ERROR : false;
323*77b80299SAndroid Build Coastguard Worker }
324*77b80299SAndroid Build Coastguard Worker 
325*77b80299SAndroid Build Coastguard Worker // ---------------------------------------------------------------------------
326*77b80299SAndroid Build Coastguard Worker 
327*77b80299SAndroid Build Coastguard Worker } // namespace hardware
328*77b80299SAndroid Build Coastguard Worker } // namespace android
329