Binder.cpp revision c5b2c0bf8007562536b822eb060fc54a01f8e08b
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
19edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <utils/Atomic.h>
20c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/BpBinder.h>
21c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IInterface.h>
22c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h>
23edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
24edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
25edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectsp<IInterface>  IBinder::queryLocalInterface(const String16& descriptor)
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
33edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
34edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
35edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder* IBinder::localBinder()
36edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
37edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
38edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
39edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
40edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder* IBinder::remoteBinder()
41edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
42edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
43edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
44edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool IBinder::checkSubclass(const void* /*subclassID*/) const
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return false;
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BBinder::Extras
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex mLock;
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpBinder::ObjectManager mObjects;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder::BBinder()
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mExtras(NULL)
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
64edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
65edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
66edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool BBinder::isBinderAlive() const
67edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
68edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
69edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
70edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
71edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::pingBinder()
72edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
73edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
74edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
75edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
76edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectString16 BBinder::getInterfaceDescriptor() const
77edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
78edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    LOGW("reached BBinder::getInterfaceDescriptor (this=%p)", this);
79edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return String16();
80edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
81edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
82edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::transact(
83edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.setDataPosition(0);
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = NO_ERROR;
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (code) {
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case PING_TRANSACTION:
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeInt32(pingBinder());
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            err = onTransact(code, data, reply, flags);
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
95edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (reply != NULL) {
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        reply->setDataPosition(0);
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::linkToDeath(
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const sp<DeathRecipient>& recipient, void* cookie, uint32_t flags)
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return INVALID_OPERATION;
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
109edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::unlinkToDeath(
111edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const wp<DeathRecipient>& recipient, void* cookie, uint32_t flags,
112edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    wp<DeathRecipient>* outRecipient)
113edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
114edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return INVALID_OPERATION;
115edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::dump(int fd, const Vector<String16>& args)
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BBinder::attachObject(
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const void* objectID, void* object, void* cleanupCookie,
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    object_cleanup_func func)
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Extras* e = mExtras;
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) {
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        e = new Extras;
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (android_atomic_cmpxchg(0, reinterpret_cast<int32_t>(e),
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project                reinterpret_cast<volatile int32_t*>(&mExtras)) != 0) {
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            delete e;
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            e = mExtras;
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (e == 0) return; // out of memory
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    e->mObjects.attach(objectID, object, cleanupCookie, func);
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
141edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
142edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* BBinder::findObject(const void* objectID) const
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Extras* e = mExtras;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) return NULL;
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
148edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return e->mObjects.find(objectID);
149edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BBinder::detachObject(const void* objectID)
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Extras* e = mExtras;
154edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) return;
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    e->mObjects.detach(objectID);
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder* BBinder::localBinder()
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return this;
163edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder::~BBinder()
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
167edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mExtras) delete mExtras;
168edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
169edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
170edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::onTransact(
172edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (code) {
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case INTERFACE_TRANSACTION:
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeString16(getInterfaceDescriptor());
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return NO_ERROR;
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case DUMP_TRANSACTION: {
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int fd = data.readFileDescriptor();
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int argc = data.readInt32();
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<String16> args;
183edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project               args.add(data.readString16());
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return dump(fd, args);
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return UNKNOWN_TRANSACTION;
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
192edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum {
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // This is used to transfer ownership of the remote binder from
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // the BpRefBase object holding it (when it is constructed), to the
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // owner of the BpRefBase object when it first acquires that BpRefBase.
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    kRemoteAcquired = 0x00000001
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpRefBase::BpRefBase(const sp<IBinder>& o)
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mRemote(o.get()), mRefs(NULL), mState(0)
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extendObjectLifetime(OBJECT_LIFETIME_WEAK);
206edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
207edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRemote->incStrong(this);           // Removed on first IncStrong().
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRefs = mRemote->createWeak(this);  // Held for our entire lifetime.
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
212edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpRefBase::~BpRefBase()
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (!(mState&kRemoteAcquired)) {
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mRemote->decStrong(this);
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRefs->decWeak(this);
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpRefBase::onFirstRef()
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    android_atomic_or(kRemoteAcquired, &mState);
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
228edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpRefBase::onLastStrongRef(const void* id)
229edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
230edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
231edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRemote->decStrong(this);
232edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
233edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
234edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
235edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool BpRefBase::onIncStrongAttempted(uint32_t flags, const void* id)
236edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
237edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mRemote ? mRefs->attemptIncStrong(this) : false;
238edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
239edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
240edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
241edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
242edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
243