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