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
196913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest#include <atomic>
20555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn#include <utils/misc.h>
21c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/BpBinder.h>
22c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/IInterface.h>
2323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn#include <binder/IResultReceiver.h>
241941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn#include <binder/IShellCallback.h>
25c5b2c0bf8007562536b822eb060fc54a01f8e08bMathias Agopian#include <binder/Parcel.h>
26edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
27edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project#include <stdio.h>
28edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
29edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectnamespace android {
30edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
31edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
32edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias AgopianIBinder::IBinder()
3483c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian    : RefBase()
3583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian{
3683c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian}
3783c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
3883c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias AgopianIBinder::~IBinder()
3983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian{
4083c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian}
4183c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
4283c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian// ---------------------------------------------------------------------------
4383c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian
446f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crosssp<IInterface>  IBinder::queryLocalInterface(const String16& /*descriptor*/)
45edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
46edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
47edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
48edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
49edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder* IBinder::localBinder()
50edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
51edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
52edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
53edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
54edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpBinder* IBinder::remoteBinder()
55edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
56edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NULL;
57edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
58edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
59edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool IBinder::checkSubclass(const void* /*subclassID*/) const
60edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
61edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return false;
62edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
63edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
6423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
65f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackbornstatus_t IBinder::shellCommand(const sp<IBinder>& target, int in, int out, int err,
661941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    Vector<String16>& args, const sp<IShellCallback>& callback,
671941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    const sp<IResultReceiver>& resultReceiver)
6823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn{
69f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    Parcel send;
70f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    Parcel reply;
71f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    send.writeFileDescriptor(in);
72f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    send.writeFileDescriptor(out);
73f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    send.writeFileDescriptor(err);
74f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    const size_t numArgs = args.size();
75f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    send.writeInt32(numArgs);
76f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    for (size_t i = 0; i < numArgs; i++) {
77f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn        send.writeString16(args[i]);
7823eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn    }
791941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn    send.writeStrongBinder(callback != NULL ? IInterface::asBinder(callback) : NULL);
80f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    send.writeStrongBinder(resultReceiver != NULL ? IInterface::asBinder(resultReceiver) : NULL);
81f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn    return target->transact(SHELL_COMMAND_TRANSACTION, send, &reply);
8223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn}
8323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
84edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
85edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
86edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectclass BBinder::Extras
87edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
88edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectpublic:
89edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    Mutex mLock;
90edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    BpBinder::ObjectManager mObjects;
91edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
92edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
93edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
94edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
956913c46492f1153cecc647a87217fbb0b0d19689Bailey ForrestBBinder::BBinder() : mExtras(nullptr)
96edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
97edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
98edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
99edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectbool BBinder::isBinderAlive() const
100edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
101edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return true;
102edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
103edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
104edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::pingBinder()
105edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
106edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
107edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
108edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
10983c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopianconst String16& BBinder::getInterfaceDescriptor() const
110edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
111386a332b4f70718cccb08d5511d66e9f4f5bd409Dan Egnor    // This is a local static rather than a global static,
112386a332b4f70718cccb08d5511d66e9f4f5bd409Dan Egnor    // to avoid static initializer ordering issues.
113386a332b4f70718cccb08d5511d66e9f4f5bd409Dan Egnor    static String16 sEmptyDescriptor;
11432397c1cd3327905173b36baa6fd1c579bc328ffSteve Block    ALOGW("reached BBinder::getInterfaceDescriptor (this=%p)", this);
11583c0446f27b9542d6c2e724817b2b2d8d1f55085Mathias Agopian    return sEmptyDescriptor;
116edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
117edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
118edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::transact(
119edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags)
120edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
121edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    data.setDataPosition(0);
122edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
123edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    status_t err = NO_ERROR;
124edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (code) {
125edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case PING_TRANSACTION:
126edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeInt32(pingBinder());
127edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
128edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
129edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            err = onTransact(code, data, reply, flags);
130edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            break;
131edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
132edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
133edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (reply != NULL) {
134edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        reply->setDataPosition(0);
135edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
136edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
137edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return err;
138edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
139edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
140edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::linkToDeath(
1416f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    const sp<DeathRecipient>& /*recipient*/, void* /*cookie*/,
1426f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    uint32_t /*flags*/)
143edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
144edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return INVALID_OPERATION;
145edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
146edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
147edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::unlinkToDeath(
1486f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    const wp<DeathRecipient>& /*recipient*/, void* /*cookie*/,
1496f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    uint32_t /*flags*/, wp<DeathRecipient>* /*outRecipient*/)
150edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
151edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return INVALID_OPERATION;
152edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
153edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
15423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackbornstatus_t BBinder::dump(int /*fd*/, const Vector<String16>& /*args*/)
155edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
156edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return NO_ERROR;
157edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
158edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
159edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BBinder::attachObject(
160edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    const void* objectID, void* object, void* cleanupCookie,
161edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    object_cleanup_func func)
162edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1636913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest    Extras* e = mExtras.load(std::memory_order_acquire);
164edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
165edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) {
166edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        e = new Extras;
1676913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest        Extras* expected = nullptr;
1686913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest        if (!mExtras.compare_exchange_strong(expected, e,
1696913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest                                             std::memory_order_release,
1706913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest                                             std::memory_order_acquire)) {
171edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            delete e;
1726913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest            e = expected;  // Filled in by CAS
173edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
174edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        if (e == 0) return; // out of memory
175edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
176edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
177edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
178edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    e->mObjects.attach(objectID, object, cleanupCookie, func);
179edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
180edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
181edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid* BBinder::findObject(const void* objectID) const
182edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1836913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest    Extras* e = mExtras.load(std::memory_order_acquire);
184edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) return NULL;
185edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
186edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
187edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return e->mObjects.find(objectID);
188edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
189edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
190edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BBinder::detachObject(const void* objectID)
191edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
1926913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest    Extras* e = mExtras.load(std::memory_order_acquire);
193edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (!e) return;
194edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
195edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    AutoMutex _l(e->mLock);
196edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    e->mObjects.detach(objectID);
197edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
198edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
199edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder* BBinder::localBinder()
200edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
201edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return this;
202edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
203edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
204edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBBinder::~BBinder()
205edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2066913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest    Extras* e = mExtras.load(std::memory_order_relaxed);
2073effababf2980d029339522fdc914bdeb913d99bHans Boehm    if (e) delete e;
208edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
209edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
210edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
211edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectstatus_t BBinder::onTransact(
2126f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Cross    uint32_t code, const Parcel& data, Parcel* reply, uint32_t /*flags*/)
213edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
214edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    switch (code) {
215edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case INTERFACE_TRANSACTION:
216edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            reply->writeString16(getInterfaceDescriptor());
217edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return NO_ERROR;
218edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
219edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        case DUMP_TRANSACTION: {
220edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int fd = data.readFileDescriptor();
221edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            int argc = data.readInt32();
222edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            Vector<String16> args;
223edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
224edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project               args.add(data.readString16());
225edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            }
226edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return dump(fd, args);
227edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
228555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn
22923eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        case SHELL_COMMAND_TRANSACTION: {
23023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            int in = data.readFileDescriptor();
23123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            int out = data.readFileDescriptor();
23223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            int err = data.readFileDescriptor();
23323eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            int argc = data.readInt32();
23423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            Vector<String16> args;
23523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            for (int i = 0; i < argc && data.dataAvail() > 0; i++) {
23623eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn               args.add(data.readString16());
23723eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            }
2381941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn            sp<IShellCallback> shellCallback = IShellCallback::asInterface(
2391941a404d642b3dfaac365ba494f1e9912876f00Dianne Hackborn                    data.readStrongBinder());
24023eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn            sp<IResultReceiver> resultReceiver = IResultReceiver::asInterface(
24123eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn                    data.readStrongBinder());
24223eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
243f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn            // XXX can't add virtuals until binaries are updated.
244f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn            //return shellCommand(in, out, err, args, resultReceiver);
2450a9a1c1ba5e5b14b583cf8ca5527ce4ac8618c8dChristopher Wiley            (void)in;
2460a9a1c1ba5e5b14b583cf8ca5527ce4ac8618c8dChristopher Wiley            (void)out;
2470a9a1c1ba5e5b14b583cf8ca5527ce4ac8618c8dChristopher Wiley            (void)err;
2480a9a1c1ba5e5b14b583cf8ca5527ce4ac8618c8dChristopher Wiley
249f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn            if (resultReceiver != NULL) {
250f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn                resultReceiver->send(INVALID_OPERATION);
251f2bf93bb080b07159ec1395c1ea8edcf5e00e829Dianne Hackborn            }
252aa6ee99e64aa4be603de6eec85b7490be4c16532Martijn Coenen
253aa6ee99e64aa4be603de6eec85b7490be4c16532Martijn Coenen            return NO_ERROR;
25423eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn        }
25523eb1e20cf59e1238b65cc108f31dfbfd85b2337Dianne Hackborn
256555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn        case SYSPROPS_TRANSACTION: {
257555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn            report_sysprop_change();
258555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn            return NO_ERROR;
259555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn        }
260555f89d8df316cdc5a25dbedb8614c2ac7a5e0a9Dianne Hackborn
261edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        default:
262edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            return UNKNOWN_TRANSACTION;
263edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
264edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
265edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
266edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
267edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
268edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectenum {
269edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // This is used to transfer ownership of the remote binder from
270edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // the BpRefBase object holding it (when it is constructed), to the
271edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    // owner of the BpRefBase object when it first acquires that BpRefBase.
272edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    kRemoteAcquired = 0x00000001
273edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project};
274edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
275edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpRefBase::BpRefBase(const sp<IBinder>& o)
276edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    : mRemote(o.get()), mRefs(NULL), mState(0)
277edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
278edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    extendObjectLifetime(OBJECT_LIFETIME_WEAK);
279edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
280edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
281edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRemote->incStrong(this);           // Removed on first IncStrong().
282edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRefs = mRemote->createWeak(this);  // Held for our entire lifetime.
283edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
284edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
285edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
286edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source ProjectBpRefBase::~BpRefBase()
287edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
288edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
2896913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest        if (!(mState.load(std::memory_order_relaxed)&kRemoteAcquired)) {
290edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project            mRemote->decStrong(this);
291edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        }
292edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRefs->decWeak(this);
293edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
294edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
295edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
296edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Projectvoid BpRefBase::onFirstRef()
297edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
2986913c46492f1153cecc647a87217fbb0b0d19689Bailey Forrest    mState.fetch_or(kRemoteAcquired, std::memory_order_relaxed);
299edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
300edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3016f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossvoid BpRefBase::onLastStrongRef(const void* /*id*/)
302edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
303edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    if (mRemote) {
304edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project        mRemote->decStrong(this);
305edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    }
306edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
307edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
3086f4f3ab36c5ed1df84eb3a9f7475f0ac42952f58Colin Crossbool BpRefBase::onIncStrongAttempted(uint32_t /*flags*/, const void* /*id*/)
309edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project{
310edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project    return mRemote ? mRefs->attemptIncStrong(this) : false;
311edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}
312edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
313edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project// ---------------------------------------------------------------------------
314edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project
315edbf3b6af777b721cd2a1ef461947e51e88241e1The Android Open Source Project}; // namespace android
316