BpBinder.cpp revision edbf3b6af777b721cd2a1ef461947e51e88241e1
1edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project/* 2edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project 3edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 4edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 5edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * you may not use this file except in compliance with the License. 6edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * You may obtain a copy of the License at 7edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 8edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 9edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * 10edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 11edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 12edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * See the License for the specific language governing permissions and 14edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project * limitations under the License. 15edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project */ 16edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 17edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#define LOG_TAG "BpBinder" 18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project//#define LOG_NDEBUG 0 19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 20edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/BpBinder.h> 21edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 22edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/IPCThreadState.h> 23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Log.h> 24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h> 26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project//#undef LOGV 28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project//#define LOGV(...) fprintf(stderr, __VA_ARGS__) 29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android { 31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder::ObjectManager::ObjectManager() 35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder::ObjectManager::~ObjectManager() 39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project kill(); 41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::ObjectManager::attach( 44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const void* objectID, void* object, void* cleanupCookie, 45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IBinder::object_cleanup_func func) 46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project entry_t e; 48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project e.object = object; 49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project e.cleanupCookie = cleanupCookie; 50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project e.func = func; 51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mObjects.indexOfKey(objectID) >= 0) { 53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGE("Trying to attach object ID %p to binder ObjectManager %p with object %p, but object ID already in use", 54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project objectID, this, object); 55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return; 56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObjects.add(objectID, e); 59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* BpBinder::ObjectManager::find(const void* objectID) const 62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const ssize_t i = mObjects.indexOfKey(objectID); 64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (i < 0) return NULL; 65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mObjects.valueAt(i).object; 66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::ObjectManager::detach(const void* objectID) 69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObjects.removeItem(objectID); 71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::ObjectManager::kill() 74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t N = mObjects.size(); 76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Killing %d objects in manager %p", N, this); 77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i=0; i<N; i++) { 78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const entry_t& e = mObjects.valueAt(i); 79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (e.func != NULL) { 80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project e.func(mObjects.keyAt(i), e.object, e.cleanupCookie); 81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObjects.clear(); 85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder::BpBinder(int32_t handle) 90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project : mHandle(handle) 91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project , mAlive(1) 92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project , mObitsSent(0) 93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project , mObituaries(NULL) 94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Creating BpBinder %p handle %d\n", this, mHandle); 96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project extendObjectLifetime(OBJECT_LIFETIME_WEAK); 98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState::self()->incWeakHandle(handle); 99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectString16 BpBinder::getInterfaceDescriptor() const 102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project String16 res; 104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel send, reply; 105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = const_cast<BpBinder*>(this)->transact( 106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project INTERFACE_TRANSACTION, send, &reply); 107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (err == NO_ERROR) { 108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project res = reply.readString16(); 109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res; 111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool BpBinder::isBinderAlive() const 114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mAlive != 0; 116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BpBinder::pingBinder() 119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel send; 121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel reply; 122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = transact(PING_TRANSACTION, send, &reply); 123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (err != NO_ERROR) return err; 124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (reply.dataSize() < sizeof(status_t)) return NOT_ENOUGH_DATA; 125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return (status_t)reply.readInt32(); 126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BpBinder::dump(int fd, const Vector<String16>& args) 129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel send; 131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Parcel reply; 132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project send.writeFileDescriptor(fd); 133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t numArgs = args.size(); 134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project send.writeInt32(numArgs); 135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i = 0; i < numArgs; i++) { 136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project send.writeString16(args[i]); 137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t err = transact(DUMP_TRANSACTION, send, &reply); 139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return err; 140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BpBinder::transact( 143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags) 144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // Once a binder has died, it will never come back to life. 146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mAlive) { 147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project status_t status = IPCThreadState::self()->transact( 148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mHandle, code, data, reply, flags); 149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (status == DEAD_OBJECT) mAlive = 0; 150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return status; 151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return DEAD_OBJECT; 154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BpBinder::linkToDeath( 157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags) 158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Obituary ob; 160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ob.recipient = recipient; 161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ob.cookie = cookie; 162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ob.flags = flags; 163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOG_ALWAYS_FATAL_IF(recipient == NULL, 165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project "linkToDeath(): recipient must be non-NULL"); 166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project { 168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project AutoMutex _l(mLock); 169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!mObitsSent) { 171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!mObituaries) { 172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObituaries = new Vector<Obituary>; 173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (!mObituaries) { 174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_MEMORY; 175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Requesting death notification: %p handle %d\n", this, mHandle); 177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project getWeakRefs()->incWeak(this); 178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* self = IPCThreadState::self(); 179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project self->requestDeathNotification(mHandle, this); 180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project self->flushCommands(); 181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ssize_t res = mObituaries->add(ob); 183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return res >= (ssize_t)NO_ERROR ? (status_t)NO_ERROR : res; 184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return DEAD_OBJECT; 188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BpBinder::unlinkToDeath( 191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const wp<DeathRecipient>& recipient, void* cookie, uint32_t flags, 192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project wp<DeathRecipient>* outRecipient) 193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project AutoMutex _l(mLock); 195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mObitsSent) { 197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return DEAD_OBJECT; 198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t N = mObituaries ? mObituaries->size() : 0; 201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i=0; i<N; i++) { 202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const Obituary& obit = mObituaries->itemAt(i); 203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if ((obit.recipient == recipient 204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project || (recipient == NULL && obit.cookie == cookie)) 205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project && obit.flags == flags) { 206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const uint32_t allFlags = obit.flags|flags; 207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (outRecipient != NULL) { 208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project *outRecipient = mObituaries->itemAt(i).recipient; 209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObituaries->removeAt(i); 211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mObituaries->size() == 0) { 212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Clearing death notification: %p handle %d\n", this, mHandle); 213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* self = IPCThreadState::self(); 214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project self->clearDeathNotification(mHandle, this); 215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project self->flushCommands(); 216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete mObituaries; 217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObituaries = NULL; 218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NO_ERROR; 220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return NAME_NOT_FOUND; 224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::sendObituary() 227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Sending obituary for proxy %p handle %d, mObitsSent=%s\n", 229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this, mHandle, mObitsSent ? "true" : "false"); 230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mAlive = 0; 232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (mObitsSent) return; 233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLock.lock(); 235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Vector<Obituary>* obits = mObituaries; 236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if(obits != NULL) { 237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Clearing sent death notification: %p handle %d\n", this, mHandle); 238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* self = IPCThreadState::self(); 239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project self->clearDeathNotification(mHandle, this); 240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project self->flushCommands(); 241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObituaries = NULL; 242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObitsSent = 1; 244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLock.unlock(); 245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Reporting death of proxy %p for %d recipients\n", 247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project this, obits ? obits->size() : 0); 248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (obits != NULL) { 250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const size_t N = obits->size(); 251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project for (size_t i=0; i<N; i++) { 252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project reportOneDeath(obits->itemAt(i)); 253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete obits; 256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 259edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::reportOneDeath(const Obituary& obit) 260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project sp<DeathRecipient> recipient = obit.recipient.promote(); 262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Reporting death to recipient: %p\n", recipient.get()); 263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (recipient == NULL) return; 264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project recipient->binderDied(this); 266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::attachObject( 270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project const void* objectID, void* object, void* cleanupCookie, 271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project object_cleanup_func func) 272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project AutoMutex _l(mLock); 274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Attaching object %p to binder %p (manager=%p)", object, this, &mObjects); 275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObjects.attach(objectID, object, cleanupCookie, func); 276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* BpBinder::findObject(const void* objectID) const 279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project AutoMutex _l(mLock); 281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return mObjects.find(objectID); 282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::detachObject(const void* objectID) 285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project AutoMutex _l(mLock); 287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObjects.detach(objectID); 288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 289edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder* BpBinder::remoteBinder() 291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return this; 293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder::~BpBinder() 296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("Destroying BpBinder %p handle %d\n", this, mHandle); 298edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 301edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLock.lock(); 302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project Vector<Obituary>* obits = mObituaries; 303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if(obits != NULL) { 304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ipc) ipc->clearDeathNotification(mHandle, this); 305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mObituaries = NULL; 306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project mLock.unlock(); 308edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (obits != NULL) { 310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // XXX Should we tell any remaining DeathRecipient 311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // objects that the last strong ref has gone away, so they 312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project // are no longer linked? 313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project delete obits; 314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 316edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ipc) { 317edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ipc->expungeHandle(mHandle, this); 318edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project ipc->decWeakHandle(mHandle); 319edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 320edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 321edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 322edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::onFirstRef() 323edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 324edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("onFirstRef BpBinder %p handle %d\n", this, mHandle); 325edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 326edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ipc) ipc->incStrongHandle(mHandle); 327edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 328edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 329edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpBinder::onLastStrongRef(const void* id) 330edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 331edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("onLastStrongRef BpBinder %p handle %d\n", this, mHandle); 332edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IF_LOGV() { 333edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project printRefs(); 334edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project } 335edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 336edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project if (ipc) ipc->decStrongHandle(mHandle); 337edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 338edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 339edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool BpBinder::onIncStrongAttempted(uint32_t flags, const void* id) 340edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{ 341edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project LOGV("onIncStrongAttempted BpBinder %p handle %d\n", this, mHandle); 342edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project IPCThreadState* ipc = IPCThreadState::self(); 343edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project return ipc ? ipc->attemptIncStrongHandle(mHandle) == NO_ERROR : false; 344edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project} 345edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 346edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// --------------------------------------------------------------------------- 347edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project 348edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android 349