17922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian/*
27922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Copyright (C) 2005 The Android Open Source Project
37922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *
47922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
57922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * you may not use this file except in compliance with the License.
67922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * You may obtain a copy of the License at
77922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *
87922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
97922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *
107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Unless required by applicable law or agreed to in writing, software
117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * See the License for the specific language governing permissions and
147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * limitations under the License.
157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian */
167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
17c4dd210df92f8d58adae5e27631be4d92cba0c43Steven Moreland#define LOG_TAG "hw-BpHwBinder"
187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian//#define LOG_NDEBUG 0
197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
201e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong#include <hwbinder/BpHwBinder.h>
217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
224080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/IPCThreadState.h>
237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Log.h>
247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <stdio.h>
267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2748f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block//#undef ALOGV
2848f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block//#define ALOGV(...) fprintf(stderr, __VA_ARGS__)
297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiannamespace android {
31f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenennamespace hardware {
327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// ---------------------------------------------------------------------------
347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
351e118d2b86540f7a7d840ec1510337da49f1446cYifan HongBpHwBinder::ObjectManager::ObjectManager()
367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
391e118d2b86540f7a7d840ec1510337da49f1446cYifan HongBpHwBinder::ObjectManager::~ObjectManager()
407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    kill();
427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
441e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::ObjectManager::attach(
457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const void* objectID, void* object, void* cleanupCookie,
467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IBinder::object_cleanup_func func)
477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    entry_t e;
497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    e.object = object;
507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    e.cleanupCookie = cleanupCookie;
517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    e.func = func;
527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (mObjects.indexOfKey(objectID) >= 0) {
54eafc6219a36d821620ab03d69e96f171a2436c40Steve Block        ALOGE("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object ID already in use",
557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                objectID, this,  object);
567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return;
577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mObjects.add(objectID, e);
607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
621e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid* BpHwBinder::ObjectManager::find(const void* objectID) const
637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const ssize_t i = mObjects.indexOfKey(objectID);
657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (i < 0) return NULL;
667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return mObjects.valueAt(i).object;
677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
691e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::ObjectManager::detach(const void* objectID)
707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mObjects.removeItem(objectID);
727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
741e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::ObjectManager::kill()
757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const size_t N = mObjects.size();
77386eb9e91e505ac52b765cfa10947b60e10726d7Mark Salyzyn    ALOGV("Killing %zu objects in manager %p", N, this);
787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    for (size_t i=0; i<N; i++) {
797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        const entry_t& e = mObjects.valueAt(i);
807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (e.func != NULL) {
817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            e.func(mObjects.keyAt(i), e.object, e.cleanupCookie);
827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mObjects.clear();
867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// ---------------------------------------------------------------------------
897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
901e118d2b86540f7a7d840ec1510337da49f1446cYifan HongBpHwBinder::BpHwBinder(int32_t handle)
917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    : mHandle(handle)
927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    , mAlive(1)
937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    , mObitsSent(0)
947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    , mObituaries(NULL)
957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
961e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong    ALOGV("Creating BpHwBinder %p handle %d\n", this, mHandle);
977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    extendObjectLifetime(OBJECT_LIFETIME_WEAK);
997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IPCThreadState::self()->incWeakHandle(handle);
1007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1021e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t BpHwBinder::transact(
10379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags, TransactCallback /*callback*/)
1047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // Once a binder has died, it will never come back to life.
1067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (mAlive) {
1077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        status_t status = IPCThreadState::self()->transact(
1087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mHandle, code, data, reply, flags);
1097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (status == DEAD_OBJECT) mAlive = 0;
1107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return status;
1117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
1127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return DEAD_OBJECT;
1147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1161e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t BpHwBinder::linkToDeath(
1177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags)
1187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    Obituary ob;
1207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    ob.recipient = recipient;
1217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    ob.cookie = cookie;
1227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    ob.flags = flags;
1237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_ALWAYS_FATAL_IF(recipient == NULL,
1257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        "linkToDeath(): recipient must be non-NULL");
1267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    {
1287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        AutoMutex _l(mLock);
1297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (!mObitsSent) {
1317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (!mObituaries) {
1327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                mObituaries = new Vector<Obituary>;
1337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                if (!mObituaries) {
1347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    return NO_MEMORY;
1357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                }
13648f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block                ALOGV("Requesting death notification: %p handle %d\n", this, mHandle);
1377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                getWeakRefs()->incWeak(this);
1387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                IPCThreadState* self = IPCThreadState::self();
1397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                self->requestDeathNotification(mHandle, this);
1407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                self->flushCommands();
1417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
1427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            ssize_t res = mObituaries->add(ob);
1437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            return res >= (ssize_t)NO_ERROR ? (status_t)NO_ERROR : res;
1447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
1457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
1467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return DEAD_OBJECT;
1487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1501e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t BpHwBinder::unlinkToDeath(
1517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const wp<DeathRecipient>& recipient, void* cookie, uint32_t flags,
1527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    wp<DeathRecipient>* outRecipient)
1537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    AutoMutex _l(mLock);
1557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (mObitsSent) {
1577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return DEAD_OBJECT;
1587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
1597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const size_t N = mObituaries ? mObituaries->size() : 0;
1617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    for (size_t i=0; i<N; i++) {
1627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        const Obituary& obit = mObituaries->itemAt(i);
1637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if ((obit.recipient == recipient
1647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    || (recipient == NULL && obit.cookie == cookie))
1657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                && obit.flags == flags) {
1667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (outRecipient != NULL) {
1677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                *outRecipient = mObituaries->itemAt(i).recipient;
1687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
1697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mObituaries->removeAt(i);
1707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (mObituaries->size() == 0) {
17148f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block                ALOGV("Clearing death notification: %p handle %d\n", this, mHandle);
1727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                IPCThreadState* self = IPCThreadState::self();
1737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                self->clearDeathNotification(mHandle, this);
1747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                self->flushCommands();
1757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                delete mObituaries;
1767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                mObituaries = NULL;
1777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
1787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            return NO_ERROR;
1797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
1807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
1817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return NAME_NOT_FOUND;
1837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1851e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::sendObituary()
1867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
18748f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block    ALOGV("Sending obituary for proxy %p handle %d, mObitsSent=%s\n",
1887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        this, mHandle, mObitsSent ? "true" : "false");
1897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mAlive = 0;
1917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (mObitsSent) return;
1927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mLock.lock();
1947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    Vector<Obituary>* obits = mObituaries;
1957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if(obits != NULL) {
19648f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block        ALOGV("Clearing sent death notification: %p handle %d\n", this, mHandle);
1977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IPCThreadState* self = IPCThreadState::self();
1987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        self->clearDeathNotification(mHandle, this);
1997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        self->flushCommands();
2007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mObituaries = NULL;
2017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mObitsSent = 1;
2037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mLock.unlock();
2047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
205386eb9e91e505ac52b765cfa10947b60e10726d7Mark Salyzyn    ALOGV("Reporting death of proxy %p for %zu recipients\n",
206386eb9e91e505ac52b765cfa10947b60e10726d7Mark Salyzyn        this, obits ? obits->size() : 0U);
2077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (obits != NULL) {
2097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        const size_t N = obits->size();
2107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        for (size_t i=0; i<N; i++) {
2117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            reportOneDeath(obits->itemAt(i));
2127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
2137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        delete obits;
2157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2181e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::reportOneDeath(const Obituary& obit)
2197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    sp<DeathRecipient> recipient = obit.recipient.promote();
22148f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block    ALOGV("Reporting death to recipient: %p\n", recipient.get());
2227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (recipient == NULL) return;
2237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    recipient->binderDied(this);
2257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2281e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::attachObject(
2297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const void* objectID, void* object, void* cleanupCookie,
2307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    object_cleanup_func func)
2317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    AutoMutex _l(mLock);
23348f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block    ALOGV("Attaching object %p to binder %p (manager=%p)", object, this, &mObjects);
2347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mObjects.attach(objectID, object, cleanupCookie, func);
2357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2371e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid* BpHwBinder::findObject(const void* objectID) const
2387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    AutoMutex _l(mLock);
2407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return mObjects.find(objectID);
2417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2431e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::detachObject(const void* objectID)
2447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    AutoMutex _l(mLock);
2467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mObjects.detach(objectID);
2477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2491e118d2b86540f7a7d840ec1510337da49f1446cYifan HongBpHwBinder* BpHwBinder::remoteBinder()
2507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return this;
2527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2541e118d2b86540f7a7d840ec1510337da49f1446cYifan HongBpHwBinder::~BpHwBinder()
2557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2561e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong    ALOGV("Destroying BpHwBinder %p handle %d\n", this, mHandle);
2577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IPCThreadState* ipc = IPCThreadState::self();
2597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mLock.lock();
2617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    Vector<Obituary>* obits = mObituaries;
2627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if(obits != NULL) {
2637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (ipc) ipc->clearDeathNotification(mHandle, this);
2647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mObituaries = NULL;
2657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mLock.unlock();
2677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (obits != NULL) {
2697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // XXX Should we tell any remaining DeathRecipient
2707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // objects that the last strong ref has gone away, so they
2717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // are no longer linked?
2727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        delete obits;
2737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (ipc) {
2767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        ipc->expungeHandle(mHandle, this);
2777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        ipc->decWeakHandle(mHandle);
2787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2811e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::onFirstRef()
2827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2831e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong    ALOGV("onFirstRef BpHwBinder %p handle %d\n", this, mHandle);
2847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IPCThreadState* ipc = IPCThreadState::self();
2857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (ipc) ipc->incStrongHandle(mHandle);
2867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2881e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongvoid BpHwBinder::onLastStrongRef(const void* /*id*/)
2897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2901e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong    ALOGV("onLastStrongRef BpHwBinder %p handle %d\n", this, mHandle);
29148f4e15e0e818a0f3ab98482da6cab37fd28af73Steve Block    IF_ALOGV() {
2927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        printRefs();
2937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IPCThreadState* ipc = IPCThreadState::self();
295e4f0b99e9b800425d8082d40b8c404c41d330b1dTomasz Wasilczyk    if (ipc) {
296e4f0b99e9b800425d8082d40b8c404c41d330b1dTomasz Wasilczyk        ipc->decStrongHandle(mHandle);
297e4f0b99e9b800425d8082d40b8c404c41d330b1dTomasz Wasilczyk        ipc->flushCommands();
298e4f0b99e9b800425d8082d40b8c404c41d330b1dTomasz Wasilczyk    }
2997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3011e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongbool BpHwBinder::onIncStrongAttempted(uint32_t /*flags*/, const void* /*id*/)
3027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3031e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong    ALOGV("onIncStrongAttempted BpHwBinder %p handle %d\n", this, mHandle);
3047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IPCThreadState* ipc = IPCThreadState::self();
3057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return ipc ? ipc->attemptIncStrongHandle(mHandle) == NO_ERROR : false;
3067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// ---------------------------------------------------------------------------
3097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
310f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen}; // namespace hardware
3117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; // namespace android
312