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