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
17c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Binder.h>
18edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1908ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm#include <stdatomic.h>
20555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn#include <utils/misc.h>
21c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/BpBinder.h>
22c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IInterface.h>
23c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h>
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias AgopianIBinder::IBinder()
3283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian    : RefBase()
3383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian{
3483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian}
3583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
3683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias AgopianIBinder::~IBinder()
3783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian{
3883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian}
3983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
4083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian// ---------------------------------------------------------------------------
4183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
426f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crosssp<IInterface>  IBinder::queryLocalInterface(const String16& /*descriptor*/)
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder* IBinder::localBinder()
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder* IBinder::remoteBinder()
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool IBinder::checkSubclass(const void* /*subclassID*/) const
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return false;
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BBinder::Extras
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex mLock;
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpBinder::ObjectManager mObjects;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder::BBinder()
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
7508ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm    atomic_init(&mExtras, 0);
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool BBinder::isBinderAlive() const
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::pingBinder()
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
8883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopianconst String16& BBinder::getInterfaceDescriptor() const
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
90386a332b4f70718cccb08d5511d66e9f4f5bd409Dan Egnor    // This is a local static rather than a global static,
91386a332b4f70718cccb08d5511d66e9f4f5bd409Dan Egnor    // to avoid static initializer ordering issues.
92386a332b4f70718cccb08d5511d66e9f4f5bd409Dan Egnor    static String16 sEmptyDescriptor;
9332397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW("reached BBinder::getInterfaceDescriptor (this=%p)", this);
9483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian    return sEmptyDescriptor;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::transact(
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.setDataPosition(0);
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = NO_ERROR;
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (code) {
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case PING_TRANSACTION:
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeInt32(pingBinder());
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            err = onTransact(code, data, reply, flags);
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (reply != NULL) {
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        reply->setDataPosition(0);
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::linkToDeath(
1206f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    const sp<DeathRecipient>& /*recipient*/, void* /*cookie*/,
1216f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    uint32_t /*flags*/)
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return INVALID_OPERATION;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::unlinkToDeath(
1276f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    const wp<DeathRecipient>& /*recipient*/, void* /*cookie*/,
1286f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    uint32_t /*flags*/, wp<DeathRecipient>* /*outRecipient*/)
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return INVALID_OPERATION;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
1336f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    status_t BBinder::dump(int /*fd*/, const Vector<String16>& /*args*/)
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BBinder::attachObject(
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const void* objectID, void* object, void* cleanupCookie,
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    object_cleanup_func func)
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
14208ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm    Extras* e = reinterpret_cast<Extras*>(
14308ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                    atomic_load_explicit(&mExtras, memory_order_acquire));
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) {
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        e = new Extras;
147553231f65e4e8d20a6f665ba86e3785a7243595fHans Boehm        uintptr_t expected = 0;
14808ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm        if (!atomic_compare_exchange_strong_explicit(
14908ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                                        &mExtras, &expected,
15008ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                                        reinterpret_cast<uintptr_t>(e),
15108ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                                        memory_order_release,
15208ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                                        memory_order_acquire)) {
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            delete e;
15408ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm            e = reinterpret_cast<Extras*>(expected);  // Filled in by CAS
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (e == 0) return; // out of memory
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    e->mObjects.attach(objectID, object, cleanupCookie, func);
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* BBinder::findObject(const void* objectID) const
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
16508ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm    Extras* e = reinterpret_cast<Extras*>(
16608ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                    atomic_load_explicit(&mExtras, memory_order_acquire));
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) return NULL;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return e->mObjects.find(objectID);
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BBinder::detachObject(const void* objectID)
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
17508ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm    Extras* e = reinterpret_cast<Extras*>(
17608ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                    atomic_load_explicit(&mExtras, memory_order_acquire));
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) return;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    e->mObjects.detach(objectID);
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder* BBinder::localBinder()
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return this;
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder::~BBinder()
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
19008ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm    Extras* e = reinterpret_cast<Extras*>(
19108ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm                    atomic_load_explicit(&mExtras, memory_order_relaxed));
19208ff802151ea3089a5f352dfc795c99017c1d122Hans Boehm    if (e) delete e;
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::onTransact(
1976f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    uint32_t code, const Parcel& data, Parcel* reply, uint32_t /*flags*/)
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (code) {
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case INTERFACE_TRANSACTION:
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeString16(getInterfaceDescriptor());
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return NO_ERROR;
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case DUMP_TRANSACTION: {
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int fd = data.readFileDescriptor();
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int argc = data.readInt32();
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<String16> args;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project               args.add(data.readString16());
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return dump(fd, args);
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
213555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn
214555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn        case SYSPROPS_TRANSACTION: {
215555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn            report_sysprop_change();
216555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn            return NO_ERROR;
217555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn        }
218555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return UNKNOWN_TRANSACTION;
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum {
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // This is used to transfer ownership of the remote binder from
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // the BpRefBase object holding it (when it is constructed), to the
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // owner of the BpRefBase object when it first acquires that BpRefBase.
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    kRemoteAcquired = 0x00000001
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpRefBase::BpRefBase(const sp<IBinder>& o)
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mRemote(o.get()), mRefs(NULL), mState(0)
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extendObjectLifetime(OBJECT_LIFETIME_WEAK);
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRemote->incStrong(this);           // Removed on first IncStrong().
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRefs = mRemote->createWeak(this);  // Held for our entire lifetime.
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
243edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
244edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpRefBase::~BpRefBase()
245edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
246edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
247edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(mState&kRemoteAcquired)) {
248edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mRemote->decStrong(this);
249edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
250edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRefs->decWeak(this);
251edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
252edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
253edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
254edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpRefBase::onFirstRef()
255edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
256edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_or(kRemoteAcquired, &mState);
257edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
258edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2596f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossvoid BpRefBase::onLastStrongRef(const void* /*id*/)
260edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRemote->decStrong(this);
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
2666f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossbool BpRefBase::onIncStrongAttempted(uint32_t /*flags*/, const void* /*id*/)
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mRemote ? mRefs->attemptIncStrong(this) : false;
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
274