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