19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/*
29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2005 The Android Open Source Project
39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License.
69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at
79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project *
109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and
149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License.
159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */
169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
17dabcf4151adeb1376ce3b6c9f4b060f9b7fd8a16Jason Parks#define LOG_TAG "IPCThreadState"
18dabcf4151adeb1376ce3b6c9f4b060f9b7fd8a16Jason Parks
190795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h>
209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
210795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Binder.h>
220795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/BpBinder.h>
23dabcf4151adeb1376ce3b6c9f4b060f9b7fd8a16Jason Parks#include <cutils/sched_policy.h>
249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Debug.h>
259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h>
269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/TextOutput.h>
279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/threads.h>
289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2925ba5b6564224dceefa086b5c439ef28dad530caMathias Agopian#include <private/binder/binder_module.h>
3025ba5b6564224dceefa086b5c439ef28dad530caMathias Agopian#include <private/binder/Static.h>
319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/ioctl.h>
339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <signal.h>
349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <errno.h>
359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <stdio.h>
369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <unistd.h>
379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_PTHREADS
399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <pthread.h>
409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sched.h>
419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/resource.h>
429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#ifdef HAVE_WIN32_THREADS
449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <windows.h>
459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if LOG_NDEBUG
499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IF_LOG_TRANSACTIONS() if (false)
519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IF_LOG_COMMANDS() if (false)
529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_REMOTEREFS(...)
539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IF_LOG_REMOTEREFS() if (false)
549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_THREADPOOL(...)
559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_ONEWAY(...)
569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IF_LOG_TRANSACTIONS() IF_LOG(LOG_VERBOSE, "transact")
609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IF_LOG_COMMANDS() IF_LOG(LOG_VERBOSE, "ipc")
619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_REMOTEREFS(...) LOG(LOG_DEBUG, "remoterefs", __VA_ARGS__)
629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define IF_LOG_REMOTEREFS() IF_LOG(LOG_DEBUG, "remoterefs")
639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_THREADPOOL(...) LOG(LOG_DEBUG, "threadpool", __VA_ARGS__)
649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_ONEWAY(...) LOG(LOG_DEBUG, "ipc", __VA_ARGS__)
659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------
699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android {
719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* getReturnString(size_t idx);
739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* getCommandString(size_t idx);
749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const void* printReturnCommand(TextOutput& out, const void* _cmd);
759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const void* printCommand(TextOutput& out, const void* _cmd);
769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// This will result in a missing symbol failure if the IF_LOG_COMMANDS()
789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// conditionals don't get stripped...  but that is probably what we want.
799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if !LOG_NDEBUG
809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char *kReturnStrings[] = {
819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 1 /* TODO: error update strings */
829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "unknown",
839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_OK",
859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_TIMEOUT",
869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_WAKEUP",
879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_TRANSACTION",
889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_REPLY",
899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_ACQUIRE_RESULT",
909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_DEAD_REPLY",
919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_TRANSACTION_COMPLETE",
929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_INCREFS",
939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_ACQUIRE",
949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_RELEASE",
959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_DECREFS",
969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_ATTEMPT_ACQUIRE",
979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_EVENT_OCCURRED",
989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_NOOP",
999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_SPAWN_LOOPER",
1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_FINISHED",
1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_DEAD_BINDER",
1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BR_CLEAR_DEATH_NOTIFICATION_DONE"
1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char *kCommandStrings[] = {
1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if 1 /* TODO: error update strings */
1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "unknown",
1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_NOOP",
1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_TRANSACTION",
1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_REPLY",
1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_ACQUIRE_RESULT",
1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_FREE_BUFFER",
1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_TRANSACTION_COMPLETE",
1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_INCREFS",
1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_ACQUIRE",
1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_RELEASE",
1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_DECREFS",
1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_INCREFS_DONE",
1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_ACQUIRE_DONE",
1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_ATTEMPT_ACQUIRE",
1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_RETRIEVE_ROOT_OBJECT",
1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_SET_THREAD_ENTRY",
1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_REGISTER_LOOPER",
1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_ENTER_LOOPER",
1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_EXIT_LOOPER",
1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_SYNC",
1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_STOP_PROCESS",
1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_STOP_SELF",
1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_REQUEST_DEATH_NOTIFICATION",
1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_CLEAR_DEATH_NOTIFICATION",
1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    "BC_DEAD_BINDER_DONE"
1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project};
1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* getReturnString(size_t idx)
1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (idx < sizeof(kReturnStrings) / sizeof(kReturnStrings[0]))
1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return kReturnStrings[idx];
1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else
1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "unknown";
1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const char* getCommandString(size_t idx)
1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (idx < sizeof(kCommandStrings) / sizeof(kCommandStrings[0]))
1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return kCommandStrings[idx];
1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    else
1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return "unknown";
1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const void* printBinderTransactionData(TextOutput& out, const void* data)
1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const binder_transaction_data* btd =
1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (const binder_transaction_data*)data;
1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    out << "target=" << btd->target.ptr << " (cookie " << btd->cookie << ")" << endl
1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        << "code=" << TypeCode(btd->code) << ", flags=" << (void*)btd->flags << endl
1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        << "data=" << btd->data.ptr.buffer << " (" << (void*)btd->data_size
1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        << " bytes)" << endl
1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        << "offsets=" << btd->data.ptr.offsets << " (" << (void*)btd->offsets_size
1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        << " bytes)" << endl;
1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return btd+1;
1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const void* printReturnCommand(TextOutput& out, const void* _cmd)
1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const int32_t N = sizeof(kReturnStrings)/sizeof(kReturnStrings[0]);
1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t* cmd = (const int32_t*)_cmd;
1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t code = *cmd++;
1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (code == BR_ERROR) {
1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out << "BR_ERROR: " << (void*)(*cmd++) << endl;
1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cmd;
1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (code < 0 || code >= N) {
1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out << "Unknown reply: " << code << endl;
1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cmd;
1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    out << kReturnStrings[code];
1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (code) {
1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_TRANSACTION:
1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_REPLY: {
1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": " << indent;
1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cmd = (const int32_t *)printBinderTransactionData(out, cmd);
1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << dedent;
1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_ACQUIRE_RESULT: {
1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t res = *cmd++;
1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)");
1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_INCREFS:
1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_ACQUIRE:
1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_RELEASE:
1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_DECREFS: {
1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t b = *cmd++;
1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t c = *cmd++;
2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": target=" << (void*)b << " (cookie " << (void*)c << ")";
2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_ATTEMPT_ACQUIRE: {
2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t p = *cmd++;
2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t b = *cmd++;
2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t c = *cmd++;
2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": target=" << (void*)b << " (cookie " << (void*)c
2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                << "), pri=" << p;
2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_DEAD_BINDER:
2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_CLEAR_DEATH_NOTIFICATION_DONE: {
2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t c = *cmd++;
2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": death cookie " << (void*)c;
2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    out << endl;
2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return cmd;
2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const void* printCommand(TextOutput& out, const void* _cmd)
2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    static const int32_t N = sizeof(kCommandStrings)/sizeof(kCommandStrings[0]);
2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const int32_t* cmd = (const int32_t*)_cmd;
2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t code = *cmd++;
2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (code < 0 || code >= N) {
2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        out << "Unknown command: " << code << endl;
2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return cmd;
2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    out << kCommandStrings[code];
2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (code) {
2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_TRANSACTION:
2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_REPLY: {
2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": " << indent;
2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cmd = (const int32_t *)printBinderTransactionData(out, cmd);
2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << dedent;
2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_ACQUIRE_RESULT: {
2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t res = *cmd++;
2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)");
2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_FREE_BUFFER: {
2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t buf = *cmd++;
2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": buffer=" << (void*)buf;
2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_INCREFS:
2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_ACQUIRE:
2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_RELEASE:
2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_DECREFS: {
2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t d = *cmd++;
2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": descriptor=" << (void*)d;
2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_INCREFS_DONE:
2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_ACQUIRE_DONE: {
2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t b = *cmd++;
2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t c = *cmd++;
2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": target=" << (void*)b << " (cookie " << (void*)c << ")";
2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_ATTEMPT_ACQUIRE: {
2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t p = *cmd++;
2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t d = *cmd++;
2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": decriptor=" << (void*)d << ", pri=" << p;
2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_REQUEST_DEATH_NOTIFICATION:
2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_CLEAR_DEATH_NOTIFICATION: {
2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t h = *cmd++;
2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t c = *cmd++;
2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": handle=" << h << " (death cookie " << (void*)c << ")";
2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BC_DEAD_BINDER_DONE: {
2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const int32_t c = *cmd++;
2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            out << ": death cookie " << (void*)c;
2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    out << endl;
2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return cmd;
2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER;
2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool gHaveTLS = false;
2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic pthread_key_t gTLS = 0;
2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic bool gShutdown = false;
2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIPCThreadState* IPCThreadState::self()
2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gHaveTLS) {
2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectrestart:
3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        const pthread_key_t k = gTLS;
3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (st) return st;
3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return new IPCThreadState;
3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gShutdown) return NULL;
3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_mutex_lock(&gTLSMutex);
3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (!gHaveTLS) {
3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (pthread_key_create(&gTLS, threadDestructor) != 0) {
3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_mutex_unlock(&gTLSMutex);
3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            return NULL;
3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gHaveTLS = true;
3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_mutex_unlock(&gTLSMutex);
3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    goto restart;
3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::shutdown()
3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    gShutdown = true;
3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (gHaveTLS) {
3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // XXX Need to wait for all thread pool threads to exit!
3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IPCThreadState* st = (IPCThreadState*)pthread_getspecific(gTLS);
3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (st) {
3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            delete st;
3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            pthread_setspecific(gTLS, NULL);
3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        gHaveTLS = false;
3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<ProcessState> IPCThreadState::process()
3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mProcess;
3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::clearLastError()
3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const status_t err = mLastError;
3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mLastError = NO_ERROR;
3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint IPCThreadState::getCallingPid()
3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mCallingPid;
3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint IPCThreadState::getCallingUid()
3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return mCallingUid;
3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectint64_t IPCThreadState::clearCallingIdentity()
3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid;
3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    clearCaller();
3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return token;
3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::restoreCallingIdentity(int64_t token)
3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mCallingUid = (int)(token>>32);
3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mCallingPid = (int)token;
3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::clearCaller()
3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
372e1babd45e1f849522b63c80d4602ec50eac74cffMarco Nelissen    mCallingPid = getpid();
373e1babd45e1f849522b63c80d4602ec50eac74cffMarco Nelissen    mCallingUid = getuid();
3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::flushCommands()
3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (mProcess->mDriverFD <= 0)
3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return;
3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    talkWithDriver(false);
3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::joinThreadPool(bool isMain)
3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid());
3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t result;
3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    do {
3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        int32_t cmd;
3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // When we've cleared the incoming command queue, process any pending derefs
3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIn.dataPosition() >= mIn.dataSize()) {
3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size_t numPending = mPendingWeakDerefs.size();
3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numPending > 0) {
3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (size_t i = 0; i < numPending; i++) {
3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    RefBase::weakref_type* refs = mPendingWeakDerefs[i];
3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    refs->decWeak(mProcess.get());
4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingWeakDerefs.clear();
4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            numPending = mPendingStrongDerefs.size();
4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (numPending > 0) {
4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                for (size_t i = 0; i < numPending; i++) {
4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    BBinder* obj = mPendingStrongDerefs[i];
4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    obj->decStrong(mProcess.get());
4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mPendingStrongDerefs.clear();
4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // now get the next command to be processed, waiting if necessary
4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = talkWithDriver();
4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (result >= NO_ERROR) {
4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            size_t IN = mIn.dataAvail();
4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (IN < sizeof(int32_t)) continue;
4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            cmd = mIn.readInt32();
4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IF_LOG_COMMANDS() {
4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alog << "Processing top-level Command: "
4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << getReturnString(cmd) << endl;
4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
424dabcf4151adeb1376ce3b6c9f4b060f9b7fd8a16Jason Parks
425dabcf4151adeb1376ce3b6c9f4b060f9b7fd8a16Jason Parks
4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = executeCommand(cmd);
4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4291dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        // After executing the command, ensure that the thread is returned to the
4301dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        // default cgroup and priority before rejoining the pool.  This is a failsafe
4311dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        // in case the command implementation failed to properly restore the thread's
4321dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        // scheduling parameters upon completion.
4331dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        int my_id;
4341dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate#ifdef HAVE_GETTID
4351dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        my_id = gettid();
4361dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate#else
4371dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        my_id = getpid();
4381dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate#endif
4391dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        if (!set_sched_policy(my_id, SP_FOREGROUND)) {
4401dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate            // success; reset the priority as well
4411dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate            setpriority(PRIO_PROCESS, my_id, ANDROID_PRIORITY_NORMAL);
4421dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate        }
4431dacdd482894bee9fbc1993cbb525fb800750222Christopher Tate
4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // Let this thread exit the thread pool if it is no longer
4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // needed and it is not the main process thread.
4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if(result == TIMED_OUT && !isMain) {
4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } while (result != -ECONNREFUSED && result != -EBADF);
4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%p\n",
4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        (void*)pthread_self(), getpid(), (void*)result);
4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_EXIT_LOOPER);
4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    talkWithDriver(false);
4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::stopProcess(bool immediate)
4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //LOGI("**** STOPPING PROCESS");
4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    flushCommands();
4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int fd = mProcess->mDriverFD;
4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mProcess->mDriverFD = -1;
4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    close(fd);
4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //kill(getpid(), SIGKILL);
4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::transact(int32_t handle,
4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  uint32_t code, const Parcel& data,
4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                  Parcel* reply, uint32_t flags)
4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err = data.errorCheck();
4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    flags |= TF_ACCEPT_FDS;
4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IF_LOG_TRANSACTIONS() {
4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextOutput::Bundle _b(alog);
4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand "
4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            << handle << " / code " << TypeCode(code) << ": "
4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            << indent << data << dedent << endl;
4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err == NO_ERROR) {
4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(),
4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY");
4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);
4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR) {
4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reply) reply->setError(err);
4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mLastError = err);
4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((flags & TF_ONE_WAY) == 0) {
4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reply) {
4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = waitForResponse(reply);
4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } else {
4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel fakeReply;
4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = waitForResponse(&fakeReply);
5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_TRANSACTIONS() {
5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TextOutput::Bundle _b(alog);
5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand "
5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                << handle << ": ";
5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (reply) alog << indent << *reply << dedent << endl;
5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else alog << "(none requested)" << endl;
5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = waitForResponse(NULL, NULL);
5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::incStrongHandle(int32_t handle)
5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle);
5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_ACQUIRE);
5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(handle);
5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::decStrongHandle(int32_t handle)
5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle);
5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_RELEASE);
5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(handle);
5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::incWeakHandle(int32_t handle)
5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle);
5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_INCREFS);
5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(handle);
5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::decWeakHandle(int32_t handle)
5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle);
5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_DECREFS);
5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(handle);
5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::attemptIncStrongHandle(int32_t handle)
5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_ATTEMPT_ACQUIRE);
5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(0); // xxx was thread priority
5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(handle);
5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t result = UNKNOWN_ERROR;
5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    waitForResponse(NULL, &result);
5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if LOG_REFCOUNTS
5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n",
5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        handle, result == NO_ERROR ? "SUCCESS" : "FAILURE");
5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::expungeHandle(int32_t handle, IBinder* binder)
5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if LOG_REFCOUNTS
5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    printf("IPCThreadState::expungeHandle(%ld)\n", handle);
5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    self()->mProcess->expungeHandle(handle, binder);
5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::requestDeathNotification(int32_t handle, BpBinder* proxy)
5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION);
5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32((int32_t)handle);
5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32((int32_t)proxy);
5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy)
5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION);
5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32((int32_t)handle);
5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32((int32_t)proxy);
5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIPCThreadState::IPCThreadState()
5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    : mProcess(ProcessState::self())
5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    pthread_setspecific(gTLS, this);
5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        clearCaller();
5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mIn.setDataCapacity(256);
5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.setDataCapacity(256);
5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source ProjectIPCThreadState::~IPCThreadState()
5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags)
5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err;
6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t statusBuffer;
6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    err = writeTransactionData(BC_REPLY, flags, -1, 0, reply, &statusBuffer);
6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err < NO_ERROR) return err;
6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return waitForResponse(NULL, NULL);
6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t cmd;
6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t err;
6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    while (1) {
6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if ((err=talkWithDriver()) < NO_ERROR) break;
6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = mIn.errorCheck();
6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (err < NO_ERROR) break;
6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (mIn.dataAvail() == 0) continue;
6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        cmd = mIn.readInt32();
6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_COMMANDS() {
6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "Processing waitForResponse Command: "
6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                << getReturnString(cmd) << endl;
6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        switch (cmd) {
6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_TRANSACTION_COMPLETE:
6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (!reply && !acquireResult) goto finish;
6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_DEAD_REPLY:
6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = DEAD_OBJECT;
6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto finish;
6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_FAILED_REPLY:
6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = FAILED_TRANSACTION;
6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto finish;
6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_ACQUIRE_RESULT:
6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT");
6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                const int32_t result = mIn.readInt32();
6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (!acquireResult) continue;
6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                *acquireResult = result ? NO_ERROR : INVALID_OPERATION;
6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto finish;
6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        case BR_REPLY:
6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            {
6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                binder_transaction_data tr;
6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                err = mIn.read(&tr, sizeof(tr));
6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY");
6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (err != NO_ERROR) goto finish;
6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (reply) {
6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    if ((tr.flags & TF_STATUS_CODE) == 0) {
6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reply->ipcSetDataReference(
6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tr.data_size,
6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tr.offsets_size/sizeof(size_t),
6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            freeBuffer, this);
6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    } else {
6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        err = *static_cast<const status_t*>(tr.data.ptr.buffer);
6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        freeBuffer(NULL,
6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tr.data_size,
6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                            tr.offsets_size/sizeof(size_t), this);
6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    }
6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                } else {
6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    freeBuffer(NULL,
6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tr.data_size,
6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                        tr.offsets_size/sizeof(size_t), this);
6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    continue;
6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                }
6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            goto finish;
6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        default:
6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = executeCommand(cmd);
6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (err != NO_ERROR) goto finish;
6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            break;
6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectfinish:
6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err != NO_ERROR) {
6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (acquireResult) *acquireResult = err;
6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (reply) reply->setError(err);
6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastError = err;
6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::talkWithDriver(bool doReceive)
7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(mProcess->mDriverFD >= 0, "Binder driver is not opened");
7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    binder_write_read bwr;
7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Is the read buffer empty?
7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const bool needRead = mIn.dataPosition() >= mIn.dataSize();
7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // We don't want to write anything if we are still reading
7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // from data left in the input buffer and the caller
7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // has requested to read the next data.
7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0;
7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bwr.write_size = outAvail;
7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bwr.write_buffer = (long unsigned int)mOut.data();
7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // This is what we'll read.
7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (doReceive && needRead) {
7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bwr.read_size = mIn.dataCapacity();
7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bwr.read_buffer = (long unsigned int)mIn.data();
7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        bwr.read_size = 0;
7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IF_LOG_COMMANDS() {
7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        TextOutput::Bundle _b(alog);
7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (outAvail != 0) {
7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "Sending commands to driver: " << indent;
7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const void* cmds = (const void*)bwr.write_buffer;
7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const void* end = ((const uint8_t*)cmds)+bwr.write_size;
7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << HexDump(cmds, bwr.write_size) << endl;
7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (cmds < end) cmds = printCommand(alog, cmds);
7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << dedent;
7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alog << "Size of receive buffer: " << bwr.read_size
7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            << ", needRead: " << needRead << ", doReceive: " << doReceive << endl;
7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    // Return immediately if there is nothing to do.
7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR;
7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bwr.write_consumed = 0;
7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    bwr.read_consumed = 0;
7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t err;
7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    do {
7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_COMMANDS() {
7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "About to read/write, write size = " << mOut.dataSize() << endl;
7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if defined(HAVE_ANDROID_OS)
7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0)
7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = NO_ERROR;
7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        else
7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            err = -errno;
7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#else
7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        err = INVALID_OPERATION;
7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_COMMANDS() {
7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "Finished read/write, write size = " << mOut.dataSize() << endl;
7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } while (err == -EINTR);
7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IF_LOG_COMMANDS() {
7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alog << "Our err: " << (void*)err << ", write consumed: "
7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            << bwr.write_consumed << " (of " << mOut.dataSize()
7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project			<< "), read consumed: " << bwr.read_consumed << endl;
7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err >= NO_ERROR) {
7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bwr.write_consumed > 0) {
7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (bwr.write_consumed < (ssize_t)mOut.dataSize())
7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOut.remove(0, bwr.write_consumed);
7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            else
7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                mOut.setDataSize(0);
7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        if (bwr.read_consumed > 0) {
7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIn.setDataSize(bwr.read_consumed);
7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mIn.setDataPosition(0);
7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_COMMANDS() {
7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            TextOutput::Bundle _b(alog);
7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "Remaining data size: " << mOut.dataSize() << endl;
7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << "Received commands from driver: " << indent;
7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const void* cmds = mIn.data();
7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const void* end = mIn.data() + mIn.dataSize();
7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << HexDump(cmds, mIn.dataSize()) << endl;
7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            while (cmds < end) cmds = printReturnCommand(alog, cmds);
7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            alog << dedent;
7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return NO_ERROR;
7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return err;
7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,
7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    binder_transaction_data tr;
7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tr.target.handle = handle;
8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tr.code = code;
8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    tr.flags = binderFlags;
8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    const status_t err = data.errorCheck();
8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (err == NO_ERROR) {
8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.data_size = data.ipcDataSize();
8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.data.ptr.buffer = data.ipcData();
8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.offsets_size = data.ipcObjectsCount()*sizeof(size_t);
8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.data.ptr.offsets = data.ipcObjects();
8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else if (statusBuffer) {
8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.flags |= TF_STATUS_CODE;
8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        *statusBuffer = err;
8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.data_size = sizeof(status_t);
8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.data.ptr.buffer = statusBuffer;
8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.offsets_size = 0;
8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        tr.data.ptr.offsets = NULL;
8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    } else {
8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        return (mLastError = err);
8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.writeInt32(cmd);
8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    mOut.write(&tr, sizeof(tr));
8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return NO_ERROR;
8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<BBinder> the_context_object;
8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid setTheContextObject(sp<BBinder> obj)
8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    the_context_object = obj;
8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatus_t IPCThreadState::executeCommand(int32_t cmd)
8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    BBinder* obj;
8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    RefBase::weakref_type* refs;
8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    status_t result = NO_ERROR;
8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    switch (cmd) {
8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_ERROR:
8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = mIn.readInt32();
8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_OK:
8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_ACQUIRE:
8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refs = (RefBase::weakref_type*)mIn.readInt32();
8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj = (BBinder*)mIn.readInt32();
8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOG_ASSERT(refs->refBase() == obj,
8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   "BR_ACQUIRE: object %p does not match cookie %p (expected %p)",
8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   refs, obj, refs->refBase());
8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj->incStrong(mProcess.get());
8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_REMOTEREFS() {
8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj);
8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            obj->printRefs();
8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOut.writeInt32(BC_ACQUIRE_DONE);
8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOut.writeInt32((int32_t)refs);
8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOut.writeInt32((int32_t)obj);
8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_RELEASE:
8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refs = (RefBase::weakref_type*)mIn.readInt32();
8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj = (BBinder*)mIn.readInt32();
8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        LOG_ASSERT(refs->refBase() == obj,
8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   "BR_RELEASE: object %p does not match cookie %p (expected %p)",
8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                   refs, obj, refs->refBase());
8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        IF_LOG_REMOTEREFS() {
8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj);
8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            obj->printRefs();
8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingStrongDerefs.push(obj);
8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_INCREFS:
8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refs = (RefBase::weakref_type*)mIn.readInt32();
8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj = (BBinder*)mIn.readInt32();
8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refs->incWeak(mProcess.get());
8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOut.writeInt32(BC_INCREFS_DONE);
8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOut.writeInt32((int32_t)refs);
8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mOut.writeInt32((int32_t)obj);
8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_DECREFS:
8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refs = (RefBase::weakref_type*)mIn.readInt32();
8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj = (BBinder*)mIn.readInt32();
8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // NOTE: This assertion is not valid, because the object may no
8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // longer exist (thus the (BBinder*)cast above resulting in a different
8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        // memory address).
8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //LOG_ASSERT(refs->refBase() == obj,
8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //           "BR_DECREFS: object %p does not match cookie %p (expected %p)",
8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        //           refs, obj, refs->refBase());
8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mPendingWeakDerefs.push(refs);
8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_ATTEMPT_ACQUIRE:
8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        refs = (RefBase::weakref_type*)mIn.readInt32();
8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        obj = (BBinder*)mIn.readInt32();
9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const bool success = refs->attemptIncStrong(mProcess.get());
9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOG_ASSERT(success && refs->refBase() == obj,
9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)",
9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                       refs, obj, refs->refBase());
9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOut.writeInt32(BC_ACQUIRE_RESULT);
9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOut.writeInt32((int32_t)success);
9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_TRANSACTION:
9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            binder_transaction_data tr;
9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            result = mIn.read(&tr, sizeof(tr));
9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            LOG_ASSERT(result == NO_ERROR,
9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                "Not enough command data for brTRANSACTION");
9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (result != NO_ERROR) break;
9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel buffer;
9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            buffer.ipcSetDataReference(
9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tr.data_size,
9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                tr.offsets_size/sizeof(size_t), freeBuffer, this);
9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const pid_t origPid = mCallingPid;
9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            const uid_t origUid = mCallingUid;
9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallingPid = tr.sender_pid;
9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallingUid = tr.sender_euid;
9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            Parcel reply;
9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IF_LOG_TRANSACTIONS() {
9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TextOutput::Bundle _b(alog);
9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alog << "BR_TRANSACTION thr " << (void*)pthread_self()
9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << " / obj " << tr.target.ptr << " / code "
9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << TypeCode(tr.code) << ": " << indent << buffer
9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << dedent << endl
9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << "Data addr = "
9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer)
9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << ", offsets addr="
9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl;
9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if (tr.target.ptr) {
9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sp<BBinder> b((BBinder*)tr.cookie);
9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                const status_t error = b->transact(tr.code, buffer, &reply, 0);
9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (error < NO_ERROR) reply.setError(error);
9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                const status_t error = the_context_object->transact(tr.code, buffer, &reply, 0);
9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                if (error < NO_ERROR) reply.setError(error);
9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            //     mCallingPid, origPid, origUid);
9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            if ((tr.flags & TF_ONE_WAY) == 0) {
9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LOG_ONEWAY("Sending reply to %d!", mCallingPid);
9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                sendReply(reply, 0);
9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            } else {
9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                LOG_ONEWAY("NOT sending reply to %d!", mCallingPid);
9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallingPid = origPid;
9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mCallingUid = origUid;
9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            IF_LOG_TRANSACTIONS() {
9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                TextOutput::Bundle _b(alog);
9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj "
9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                    << tr.target.ptr << ": " << indent << reply << dedent << endl;
9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            }
9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        }
9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_DEAD_BINDER:
9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            BpBinder *proxy = (BpBinder*)mIn.readInt32();
9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            proxy->sendObituary();
9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOut.writeInt32(BC_DEAD_BINDER_DONE);
9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            mOut.writeInt32((int32_t)proxy);
9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_CLEAR_DEATH_NOTIFICATION_DONE:
9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        {
9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            BpBinder *proxy = (BpBinder*)mIn.readInt32();
9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project            proxy->getWeakRefs()->decWeak(proxy);
9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        } break;
9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_FINISHED:
9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = TIMED_OUT;
9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_NOOP:
9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    case BR_SPAWN_LOOPER:
10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mProcess->spawnPooledThread(false);
10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    default:
10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        printf("*** BAD COMMAND %d received from Binder driver\n", cmd);
10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        result = UNKNOWN_ERROR;
10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        break;
10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (result != NO_ERROR) {
10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        mLastError = result;
10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    return result;
10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::threadDestructor(void *st)
10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	IPCThreadState* const self = static_cast<IPCThreadState*>(st);
10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	if (self) {
10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		self->flushCommands();
10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#if defined(HAVE_ANDROID_OS)
10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0);
10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#endif
10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project		delete self;
10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project	}
10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectvoid IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, size_t dataSize,
10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                const size_t* objects, size_t objectsSize,
10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project                                void* cookie)
10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{
10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    //LOGI("Freeing parcel %p", &parcel);
10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IF_LOG_COMMANDS() {
10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project        alog << "Writing BC_FREE_BUFFER for " << data << endl;
10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    }
10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    LOG_ASSERT(data != NULL, "Called with NULL data");
10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    if (parcel != NULL) parcel->closeFileDescriptors();
10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    IPCThreadState* state = self();
10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    state->mOut.writeInt32(BC_FREE_BUFFER);
10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project    state->mOut.writeInt32((int32_t)data);
10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}
10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project
10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; // namespace android
1046