IPCThreadState.cpp revision 94c3634ac573531efe9a5abbc122a35c201567ad
17922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian/*
27922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Copyright (C) 2005 The Android Open Source Project
37922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *
47922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
57922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * you may not use this file except in compliance with the License.
67922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * You may obtain a copy of the License at
77922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *
87922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
97922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *
107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Unless required by applicable law or agreed to in writing, software
117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * See the License for the specific language governing permissions and
147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * limitations under the License.
157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian */
167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
172b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks#define LOG_TAG "IPCThreadState"
182b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks
19164757037f944dae1eb5f76176570b2e43a37b55Mathias Agopian#include <binder/IPCThreadState.h>
207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
21164757037f944dae1eb5f76176570b2e43a37b55Mathias Agopian#include <binder/Binder.h>
22164757037f944dae1eb5f76176570b2e43a37b55Mathias Agopian#include <binder/BpBinder.h>
232b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks#include <cutils/sched_policy.h>
247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Debug.h>
257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Log.h>
267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/TextOutput.h>
277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/threads.h>
287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <private/binder/binder_module.h>
307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <private/binder/Static.h>
317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sys/ioctl.h>
337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <signal.h>
347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <errno.h>
357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <stdio.h>
367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <unistd.h>
377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#ifdef HAVE_PTHREADS
397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <pthread.h>
407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sched.h>
417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sys/resource.h>
427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#ifdef HAVE_WIN32_THREADS
447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <windows.h>
457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_NDEBUG
497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_TRANSACTIONS() if (false)
517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_COMMANDS() if (false)
527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_REMOTEREFS(...)
537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_REMOTEREFS() if (false)
547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_THREADPOOL(...)
557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_ONEWAY(...)
567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else
587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_TRANSACTIONS() IF_LOG(LOG_VERBOSE, "transact")
607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_COMMANDS() IF_LOG(LOG_VERBOSE, "ipc")
617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_REMOTEREFS(...) LOG(LOG_DEBUG, "remoterefs", __VA_ARGS__)
627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_REMOTEREFS() IF_LOG(LOG_DEBUG, "remoterefs")
637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_THREADPOOL(...) LOG(LOG_DEBUG, "threadpool", __VA_ARGS__)
647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_ONEWAY(...) LOG(LOG_DEBUG, "ipc", __VA_ARGS__)
657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// ---------------------------------------------------------------------------
697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiannamespace android {
717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx);
737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getCommandString(size_t idx);
747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd);
757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd);
767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// This will result in a missing symbol failure if the IF_LOG_COMMANDS()
787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// conditionals don't get stripped...  but that is probably what we want.
797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if !LOG_NDEBUG
807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kReturnStrings[] = {
817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if 1 /* TODO: error update strings */
827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "unknown",
837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else
847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_OK",
857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_TIMEOUT",
867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_WAKEUP",
877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_TRANSACTION",
887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_REPLY",
897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_ACQUIRE_RESULT",
907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_DEAD_REPLY",
917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_TRANSACTION_COMPLETE",
927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_INCREFS",
937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_ACQUIRE",
947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_RELEASE",
957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_DECREFS",
967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_ATTEMPT_ACQUIRE",
977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_EVENT_OCCURRED",
987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_NOOP",
997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_SPAWN_LOOPER",
1007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_FINISHED",
1017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_DEAD_BINDER",
1027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BR_CLEAR_DEATH_NOTIFICATION_DONE"
1037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
1047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian};
1057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kCommandStrings[] = {
1077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if 1 /* TODO: error update strings */
1087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "unknown",
1097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else
1107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_NOOP",
1117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_TRANSACTION",
1127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_REPLY",
1137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_ACQUIRE_RESULT",
1147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_FREE_BUFFER",
1157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_TRANSACTION_COMPLETE",
1167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_INCREFS",
1177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_ACQUIRE",
1187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_RELEASE",
1197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_DECREFS",
1207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_INCREFS_DONE",
1217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_ACQUIRE_DONE",
1227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_ATTEMPT_ACQUIRE",
1237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_RETRIEVE_ROOT_OBJECT",
1247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_SET_THREAD_ENTRY",
1257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_REGISTER_LOOPER",
1267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_ENTER_LOOPER",
1277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_EXIT_LOOPER",
1287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_SYNC",
1297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_STOP_PROCESS",
1307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_STOP_SELF",
1317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_REQUEST_DEATH_NOTIFICATION",
1327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_CLEAR_DEATH_NOTIFICATION",
1337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    "BC_DEAD_BINDER_DONE"
1347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
1357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian};
1367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx)
1387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (idx < sizeof(kReturnStrings) / sizeof(kReturnStrings[0]))
1407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return kReturnStrings[idx];
1417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    else
1427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return "unknown";
1437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getCommandString(size_t idx)
1467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (idx < sizeof(kCommandStrings) / sizeof(kCommandStrings[0]))
1487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return kCommandStrings[idx];
1497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    else
1507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return "unknown";
1517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printBinderTransactionData(TextOutput& out, const void* data)
1547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const binder_transaction_data* btd =
1567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        (const binder_transaction_data*)data;
1577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    out << "target=" << btd->target.ptr << " (cookie " << btd->cookie << ")" << endl
1587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        << "code=" << TypeCode(btd->code) << ", flags=" << (void*)btd->flags << endl
1597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        << "data=" << btd->data.ptr.buffer << " (" << (void*)btd->data_size
1607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        << " bytes)" << endl
1617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        << "offsets=" << btd->data.ptr.offsets << " (" << (void*)btd->offsets_size
1627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        << " bytes)" << endl;
1637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return btd+1;
1647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
1657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd)
1677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
1687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    static const int32_t N = sizeof(kReturnStrings)/sizeof(kReturnStrings[0]);
1697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const int32_t* cmd = (const int32_t*)_cmd;
1717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int32_t code = *cmd++;
1727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (code == BR_ERROR) {
1737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        out << "BR_ERROR: " << (void*)(*cmd++) << endl;
1747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return cmd;
1757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } else if (code < 0 || code >= N) {
1767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        out << "Unknown reply: " << code << endl;
1777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return cmd;
1787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
1797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    out << kReturnStrings[code];
1817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    switch (code) {
1827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_TRANSACTION:
1837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_REPLY: {
1847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": " << indent;
1857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            cmd = (const int32_t *)printBinderTransactionData(out, cmd);
1867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << dedent;
1877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
1887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_ACQUIRE_RESULT: {
1907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t res = *cmd++;
1917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)");
1927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
1937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
1947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_INCREFS:
1957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_ACQUIRE:
1967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_RELEASE:
1977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_DECREFS: {
1987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t b = *cmd++;
1997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t c = *cmd++;
2007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": target=" << (void*)b << " (cookie " << (void*)c << ")";
2017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_ATTEMPT_ACQUIRE: {
2047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t p = *cmd++;
2057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t b = *cmd++;
2067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t c = *cmd++;
2077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": target=" << (void*)b << " (cookie " << (void*)c
2087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                << "), pri=" << p;
2097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_DEAD_BINDER:
2127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_CLEAR_DEATH_NOTIFICATION_DONE: {
2137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t c = *cmd++;
2147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": death cookie " << (void*)c;
2157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    out << endl;
2197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return cmd;
2207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd)
2237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    static const int32_t N = sizeof(kCommandStrings)/sizeof(kCommandStrings[0]);
2257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const int32_t* cmd = (const int32_t*)_cmd;
2277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int32_t code = *cmd++;
2287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (code < 0 || code >= N) {
2297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        out << "Unknown command: " << code << endl;
2307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return cmd;
2317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    out << kCommandStrings[code];
2347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    switch (code) {
2357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_TRANSACTION:
2367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_REPLY: {
2377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": " << indent;
2387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            cmd = (const int32_t *)printBinderTransactionData(out, cmd);
2397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << dedent;
2407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_ACQUIRE_RESULT: {
2437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t res = *cmd++;
2447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)");
2457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_FREE_BUFFER: {
2487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t buf = *cmd++;
2497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": buffer=" << (void*)buf;
2507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_INCREFS:
2537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_ACQUIRE:
2547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_RELEASE:
2557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_DECREFS: {
2567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t d = *cmd++;
2577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": descriptor=" << (void*)d;
2587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_INCREFS_DONE:
2617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_ACQUIRE_DONE: {
2627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t b = *cmd++;
2637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t c = *cmd++;
2647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": target=" << (void*)b << " (cookie " << (void*)c << ")";
2657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_ATTEMPT_ACQUIRE: {
2687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t p = *cmd++;
2697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t d = *cmd++;
2707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": decriptor=" << (void*)d << ", pri=" << p;
2717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_REQUEST_DEATH_NOTIFICATION:
2747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_CLEAR_DEATH_NOTIFICATION: {
2757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t h = *cmd++;
2767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t c = *cmd++;
2777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": handle=" << h << " (death cookie " << (void*)c << ")";
2787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BC_DEAD_BINDER_DONE: {
2817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const int32_t c = *cmd++;
2827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            out << ": death cookie " << (void*)c;
2837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
2847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
2857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    out << endl;
2877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return cmd;
2887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
2897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
2907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER;
2927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gHaveTLS = false;
2937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_key_t gTLS = 0;
2947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gShutdown = false;
2955f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornstatic bool gDisableBackgroundScheduling = false;
2967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
2977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState* IPCThreadState::self()
2987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
2997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (gHaveTLS) {
3007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianrestart:
3017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        const pthread_key_t k = gTLS;
3027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
3037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (st) return st;
3047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return new IPCThreadState;
3057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
3067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (gShutdown) return NULL;
3087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    pthread_mutex_lock(&gTLSMutex);
3107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (!gHaveTLS) {
3117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (pthread_key_create(&gTLS, threadDestructor) != 0) {
3127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            pthread_mutex_unlock(&gTLSMutex);
3137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            return NULL;
3147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
3157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        gHaveTLS = true;
3167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
3177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    pthread_mutex_unlock(&gTLSMutex);
3187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    goto restart;
3197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::shutdown()
3227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    gShutdown = true;
3247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (gHaveTLS) {
3267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // XXX Need to wait for all thread pool threads to exit!
3277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IPCThreadState* st = (IPCThreadState*)pthread_getspecific(gTLS);
3287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (st) {
3297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            delete st;
3307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            pthread_setspecific(gTLS, NULL);
3317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
3327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        gHaveTLS = false;
3337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
3347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3365f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornvoid IPCThreadState::disableBackgroundScheduling(bool disable)
3375f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn{
3385f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn    gDisableBackgroundScheduling = disable;
3395f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn}
3405f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn
3417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiansp<ProcessState> IPCThreadState::process()
3427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return mProcess;
3447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearLastError()
3477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const status_t err = mLastError;
3497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mLastError = NO_ERROR;
3507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return err;
3517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianint IPCThreadState::getCallingPid()
3547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return mCallingPid;
3567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianint IPCThreadState::getCallingUid()
3597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return mCallingUid;
3617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianint64_t IPCThreadState::clearCallingIdentity()
3647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid;
3667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    clearCaller();
3677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return token;
3687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
37094c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrickvoid IPCThreadState::setStrictModePolicy(int32_t policy)
37194c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick{
37294c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick    mStrictModePolicy = policy;
37394c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick}
37494c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick
37594c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick
37694c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrickint32_t IPCThreadState::getStrictModePolicy() const {
37794c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick    return mStrictModePolicy;
37894c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick}
37994c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick
3807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::restoreCallingIdentity(int64_t token)
3817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mCallingUid = (int)(token>>32);
3837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mCallingPid = (int)token;
3847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::clearCaller()
3877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
388b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen    mCallingPid = getpid();
389b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen    mCallingUid = getuid();
3907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::flushCommands()
3937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
3947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (mProcess->mDriverFD <= 0)
3957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return;
3967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    talkWithDriver(false);
3977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
3987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
3997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::joinThreadPool(bool isMain)
4007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
4017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid());
4027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER);
4047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4055f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn    // This thread may have been spawned by a thread that was in the background
4065f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn    // scheduling group, so first we will make sure it is in the default/foreground
4075f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn    // one to avoid performing an initial transaction in the background.
4085f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn    androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT);
4095f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn
4107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t result;
4117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    do {
4127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        int32_t cmd;
4137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // When we've cleared the incoming command queue, process any pending derefs
4157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (mIn.dataPosition() >= mIn.dataSize()) {
4167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            size_t numPending = mPendingWeakDerefs.size();
4177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (numPending > 0) {
4187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                for (size_t i = 0; i < numPending; i++) {
4197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    RefBase::weakref_type* refs = mPendingWeakDerefs[i];
4207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    refs->decWeak(mProcess.get());
4217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                }
4227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                mPendingWeakDerefs.clear();
4237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
4247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            numPending = mPendingStrongDerefs.size();
4267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (numPending > 0) {
4277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                for (size_t i = 0; i < numPending; i++) {
4287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    BBinder* obj = mPendingStrongDerefs[i];
4297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    obj->decStrong(mProcess.get());
4307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                }
4317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                mPendingStrongDerefs.clear();
4327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
4337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
4347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // now get the next command to be processed, waiting if necessary
4367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        result = talkWithDriver();
4377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (result >= NO_ERROR) {
4387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            size_t IN = mIn.dataAvail();
4397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (IN < sizeof(int32_t)) continue;
4407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            cmd = mIn.readInt32();
4417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            IF_LOG_COMMANDS() {
4427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                alog << "Processing top-level Command: "
4437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << getReturnString(cmd) << endl;
4447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
4452b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks
4462b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks
4477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            result = executeCommand(cmd);
4487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
4497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4500d7c8beb3788e64c201f8a40d629b43c8a5519b7Christopher Tate        // After executing the command, ensure that the thread is returned to the
4515f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        // default cgroup before rejoining the pool.  The driver takes care of
4525f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        // restoring the priority, but doesn't do anything with cgroups so we
4535f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        // need to take care of that here in userspace.  Note that we do make
4545f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        // sure to go in the foreground after executing a transaction, but
4555f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        // there are other callbacks into user code that could have changed
4565f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        // our group so we want to make absolutely sure it is put back.
4575f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn        androidSetThreadSchedulingGroup(mMyThreadId, ANDROID_TGROUP_DEFAULT);
4580d7c8beb3788e64c201f8a40d629b43c8a5519b7Christopher Tate
4597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // Let this thread exit the thread pool if it is no longer
4607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // needed and it is not the main process thread.
4617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if(result == TIMED_OUT && !isMain) {
4627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            break;
4637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
4647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } while (result != -ECONNREFUSED && result != -EBADF);
4657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%p\n",
4677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        (void*)pthread_self(), getpid(), (void*)result);
4687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_EXIT_LOOPER);
4707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    talkWithDriver(false);
4717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
4727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::stopProcess(bool immediate)
4747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
4757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    //LOGI("**** STOPPING PROCESS");
4767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    flushCommands();
4777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int fd = mProcess->mDriverFD;
4787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mProcess->mDriverFD = -1;
4797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    close(fd);
4807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    //kill(getpid(), SIGKILL);
4817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
4827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::transact(int32_t handle,
4847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                                  uint32_t code, const Parcel& data,
4857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                                  Parcel* reply, uint32_t flags)
4867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
4877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t err = data.errorCheck();
4887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    flags |= TF_ACCEPT_FDS;
4907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IF_LOG_TRANSACTIONS() {
4927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        TextOutput::Bundle _b(alog);
4937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand "
4947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            << handle << " / code " << TypeCode(code) << ": "
4957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            << indent << data << dedent << endl;
4967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
4977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
4987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (err == NO_ERROR) {
4997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(),
5007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY");
5017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL);
5027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
5037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (err != NO_ERROR) {
5057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (reply) reply->setError(err);
5067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return (mLastError = err);
5077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
5087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if ((flags & TF_ONE_WAY) == 0) {
5107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (reply) {
5117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = waitForResponse(reply);
5127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } else {
5137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            Parcel fakeReply;
5147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = waitForResponse(&fakeReply);
5157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
5167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_TRANSACTIONS() {
5187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            TextOutput::Bundle _b(alog);
5197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand "
5207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                << handle << ": ";
5217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (reply) alog << indent << *reply << dedent << endl;
5227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            else alog << "(none requested)" << endl;
5237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
5247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } else {
5257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        err = waitForResponse(NULL, NULL);
5267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
5277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return err;
5297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incStrongHandle(int32_t handle)
5327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle);
5347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_ACQUIRE);
5357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(handle);
5367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decStrongHandle(int32_t handle)
5397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle);
5417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_RELEASE);
5427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(handle);
5437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incWeakHandle(int32_t handle)
5467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle);
5487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_INCREFS);
5497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(handle);
5507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decWeakHandle(int32_t handle)
5537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle);
5557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_DECREFS);
5567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(handle);
5577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::attemptIncStrongHandle(int32_t handle)
5607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_ATTEMPT_ACQUIRE);
5627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(0); // xxx was thread priority
5637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(handle);
5647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t result = UNKNOWN_ERROR;
5657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    waitForResponse(NULL, &result);
5677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS
5697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n",
5707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        handle, result == NO_ERROR ? "SUCCESS" : "FAILURE");
5717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
5727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return result;
5747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::expungeHandle(int32_t handle, IBinder* binder)
5777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS
5797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    printf("IPCThreadState::expungeHandle(%ld)\n", handle);
5807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
5817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    self()->mProcess->expungeHandle(handle, binder);
5827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::requestDeathNotification(int32_t handle, BpBinder* proxy)
5857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION);
5877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32((int32_t)handle);
5887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32((int32_t)proxy);
5897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return NO_ERROR;
5907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
5927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy)
5937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
5947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION);
5957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32((int32_t)handle);
5967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32((int32_t)proxy);
5977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return NO_ERROR;
5987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
5997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::IPCThreadState()
60194c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick    : mProcess(ProcessState::self()), mMyThreadId(androidGetTid()),
60294c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick      mStrictModePolicy(0)
6037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
6047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    pthread_setspecific(gTLS, this);
6055f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn    clearCaller();
6067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mIn.setDataCapacity(256);
6077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.setDataCapacity(256);
6087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
6097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::~IPCThreadState()
6117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
6127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
6137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags)
6157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
6167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t err;
6177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t statusBuffer;
6187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    err = writeTransactionData(BC_REPLY, flags, -1, 0, reply, &statusBuffer);
6197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (err < NO_ERROR) return err;
6207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return waitForResponse(NULL, NULL);
6227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
6237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult)
6257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
6267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int32_t cmd;
6277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int32_t err;
6287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    while (1) {
6307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if ((err=talkWithDriver()) < NO_ERROR) break;
6317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        err = mIn.errorCheck();
6327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (err < NO_ERROR) break;
6337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (mIn.dataAvail() == 0) continue;
6347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        cmd = mIn.readInt32();
6367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_COMMANDS() {
6387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "Processing waitForResponse Command: "
6397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                << getReturnString(cmd) << endl;
6407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
6417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        switch (cmd) {
6437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_TRANSACTION_COMPLETE:
6447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (!reply && !acquireResult) goto finish;
6457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            break;
6467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_DEAD_REPLY:
6487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = DEAD_OBJECT;
6497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            goto finish;
6507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_FAILED_REPLY:
6527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = FAILED_TRANSACTION;
6537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            goto finish;
6547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_ACQUIRE_RESULT:
6567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            {
6577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                LOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT");
6587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                const int32_t result = mIn.readInt32();
6597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                if (!acquireResult) continue;
6607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                *acquireResult = result ? NO_ERROR : INVALID_OPERATION;
6617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
6627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            goto finish;
6637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        case BR_REPLY:
6657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            {
6667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                binder_transaction_data tr;
6677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                err = mIn.read(&tr, sizeof(tr));
6687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                LOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY");
6697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                if (err != NO_ERROR) goto finish;
6707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                if (reply) {
6727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    if ((tr.flags & TF_STATUS_CODE) == 0) {
6737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        reply->ipcSetDataReference(
6747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
6757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            tr.data_size,
6767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
6777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            tr.offsets_size/sizeof(size_t),
6787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            freeBuffer, this);
6797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    } else {
6807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        err = *static_cast<const status_t*>(tr.data.ptr.buffer);
6817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        freeBuffer(NULL,
6827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
6837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            tr.data_size,
6847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
6857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                            tr.offsets_size/sizeof(size_t), this);
6867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    }
6877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                } else {
6887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    freeBuffer(NULL,
6897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
6907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        tr.data_size,
6917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
6927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                        tr.offsets_size/sizeof(size_t), this);
6937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    continue;
6947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                }
6957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
6967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            goto finish;
6977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
6987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        default:
6997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = executeCommand(cmd);
7007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (err != NO_ERROR) goto finish;
7017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            break;
7027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
7037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
7047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianfinish:
7067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (err != NO_ERROR) {
7077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (acquireResult) *acquireResult = err;
7087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (reply) reply->setError(err);
7097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mLastError = err;
7107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
7117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return err;
7137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
7147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::talkWithDriver(bool doReceive)
7167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
7177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_ASSERT(mProcess->mDriverFD >= 0, "Binder driver is not opened");
7187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    binder_write_read bwr;
7207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // Is the read buffer empty?
7227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const bool needRead = mIn.dataPosition() >= mIn.dataSize();
7237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // We don't want to write anything if we are still reading
7257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // from data left in the input buffer and the caller
7267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // has requested to read the next data.
7277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0;
7287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    bwr.write_size = outAvail;
7307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    bwr.write_buffer = (long unsigned int)mOut.data();
7317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // This is what we'll read.
7337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (doReceive && needRead) {
7347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        bwr.read_size = mIn.dataCapacity();
7357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        bwr.read_buffer = (long unsigned int)mIn.data();
7367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } else {
7377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        bwr.read_size = 0;
7387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
7397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IF_LOG_COMMANDS() {
7417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        TextOutput::Bundle _b(alog);
7427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (outAvail != 0) {
7437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "Sending commands to driver: " << indent;
7447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const void* cmds = (const void*)bwr.write_buffer;
7457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const void* end = ((const uint8_t*)cmds)+bwr.write_size;
7467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << HexDump(cmds, bwr.write_size) << endl;
7477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            while (cmds < end) cmds = printCommand(alog, cmds);
7487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << dedent;
7497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
7507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        alog << "Size of receive buffer: " << bwr.read_size
7517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            << ", needRead: " << needRead << ", doReceive: " << doReceive << endl;
7527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
7537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    // Return immediately if there is nothing to do.
7557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR;
7567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    bwr.write_consumed = 0;
7587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    bwr.read_consumed = 0;
7597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t err;
7607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    do {
7617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_COMMANDS() {
7627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "About to read/write, write size = " << mOut.dataSize() << endl;
7637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
7647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if defined(HAVE_ANDROID_OS)
7657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0)
7667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = NO_ERROR;
7677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        else
7687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            err = -errno;
7697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else
7707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        err = INVALID_OPERATION;
7717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
7727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_COMMANDS() {
7737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "Finished read/write, write size = " << mOut.dataSize() << endl;
7747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
7757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } while (err == -EINTR);
7767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IF_LOG_COMMANDS() {
7787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        alog << "Our err: " << (void*)err << ", write consumed: "
7797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            << bwr.write_consumed << " (of " << mOut.dataSize()
7807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian			<< "), read consumed: " << bwr.read_consumed << endl;
7817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
7827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
7837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (err >= NO_ERROR) {
7847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (bwr.write_consumed > 0) {
7857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (bwr.write_consumed < (ssize_t)mOut.dataSize())
7867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                mOut.remove(0, bwr.write_consumed);
7877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            else
7887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                mOut.setDataSize(0);
7897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
7907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        if (bwr.read_consumed > 0) {
7917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mIn.setDataSize(bwr.read_consumed);
7927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mIn.setDataPosition(0);
7937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
7947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_COMMANDS() {
7957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            TextOutput::Bundle _b(alog);
7967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "Remaining data size: " << mOut.dataSize() << endl;
7977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << "Received commands from driver: " << indent;
7987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const void* cmds = mIn.data();
7997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const void* end = mIn.data() + mIn.dataSize();
8007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << HexDump(cmds, mIn.dataSize()) << endl;
8017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            while (cmds < end) cmds = printReturnCommand(alog, cmds);
8027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            alog << dedent;
8037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
8047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return NO_ERROR;
8057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
8067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return err;
8087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
8097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags,
8117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer)
8127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
8137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    binder_transaction_data tr;
8147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    tr.target.handle = handle;
8167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    tr.code = code;
8177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    tr.flags = binderFlags;
8187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    const status_t err = data.errorCheck();
8207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (err == NO_ERROR) {
8217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.data_size = data.ipcDataSize();
8227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.data.ptr.buffer = data.ipcData();
8237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.offsets_size = data.ipcObjectsCount()*sizeof(size_t);
8247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.data.ptr.offsets = data.ipcObjects();
8257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } else if (statusBuffer) {
8267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.flags |= TF_STATUS_CODE;
8277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        *statusBuffer = err;
8287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.data_size = sizeof(status_t);
8297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.data.ptr.buffer = statusBuffer;
8307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.offsets_size = 0;
8317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        tr.data.ptr.offsets = NULL;
8327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    } else {
8337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        return (mLastError = err);
8347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
8357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.writeInt32(cmd);
8377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    mOut.write(&tr, sizeof(tr));
8387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return NO_ERROR;
8407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
8417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiansp<BBinder> the_context_object;
8437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid setTheContextObject(sp<BBinder> obj)
8457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
8467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    the_context_object = obj;
8477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
8487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::executeCommand(int32_t cmd)
8507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
8517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    BBinder* obj;
8527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    RefBase::weakref_type* refs;
8537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    status_t result = NO_ERROR;
8547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    switch (cmd) {
8567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_ERROR:
8577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        result = mIn.readInt32();
8587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
8597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_OK:
8617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
8627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_ACQUIRE:
8647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        refs = (RefBase::weakref_type*)mIn.readInt32();
8657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        obj = (BBinder*)mIn.readInt32();
8667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        LOG_ASSERT(refs->refBase() == obj,
8677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                   "BR_ACQUIRE: object %p does not match cookie %p (expected %p)",
8687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                   refs, obj, refs->refBase());
8697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        obj->incStrong(mProcess.get());
8707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_REMOTEREFS() {
8717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj);
8727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            obj->printRefs();
8737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
8747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mOut.writeInt32(BC_ACQUIRE_DONE);
8757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mOut.writeInt32((int32_t)refs);
8767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mOut.writeInt32((int32_t)obj);
8777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
8787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_RELEASE:
8807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        refs = (RefBase::weakref_type*)mIn.readInt32();
8817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        obj = (BBinder*)mIn.readInt32();
8827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        LOG_ASSERT(refs->refBase() == obj,
8837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                   "BR_RELEASE: object %p does not match cookie %p (expected %p)",
8847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                   refs, obj, refs->refBase());
8857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        IF_LOG_REMOTEREFS() {
8867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj);
8877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            obj->printRefs();
8887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
8897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mPendingStrongDerefs.push(obj);
8907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
8917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
8927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_INCREFS:
8937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        refs = (RefBase::weakref_type*)mIn.readInt32();
8947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        obj = (BBinder*)mIn.readInt32();
8957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        refs->incWeak(mProcess.get());
8967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mOut.writeInt32(BC_INCREFS_DONE);
8977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mOut.writeInt32((int32_t)refs);
8987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mOut.writeInt32((int32_t)obj);
8997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
9007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_DECREFS:
9027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        refs = (RefBase::weakref_type*)mIn.readInt32();
9037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        obj = (BBinder*)mIn.readInt32();
9047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // NOTE: This assertion is not valid, because the object may no
9057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // longer exist (thus the (BBinder*)cast above resulting in a different
9067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        // memory address).
9077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        //LOG_ASSERT(refs->refBase() == obj,
9087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        //           "BR_DECREFS: object %p does not match cookie %p (expected %p)",
9097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        //           refs, obj, refs->refBase());
9107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mPendingWeakDerefs.push(refs);
9117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
9127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_ATTEMPT_ACQUIRE:
9147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        refs = (RefBase::weakref_type*)mIn.readInt32();
9157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        obj = (BBinder*)mIn.readInt32();
9167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        {
9187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const bool success = refs->attemptIncStrong(mProcess.get());
9197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            LOG_ASSERT(success && refs->refBase() == obj,
9207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                       "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)",
9217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                       refs, obj, refs->refBase());
9227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mOut.writeInt32(BC_ACQUIRE_RESULT);
9247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mOut.writeInt32((int32_t)success);
9257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
9267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
9277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_TRANSACTION:
9297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        {
9307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            binder_transaction_data tr;
9317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            result = mIn.read(&tr, sizeof(tr));
9327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            LOG_ASSERT(result == NO_ERROR,
9337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                "Not enough command data for brTRANSACTION");
9347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (result != NO_ERROR) break;
9357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            Parcel buffer;
9377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            buffer.ipcSetDataReference(
9387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer),
9397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                tr.data_size,
9407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                reinterpret_cast<const size_t*>(tr.data.ptr.offsets),
9417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                tr.offsets_size/sizeof(size_t), freeBuffer, this);
9427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const pid_t origPid = mCallingPid;
9447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            const uid_t origUid = mCallingUid;
9457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mCallingPid = tr.sender_pid;
9477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mCallingUid = tr.sender_euid;
9487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9497c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate            int curPrio = getpriority(PRIO_PROCESS, mMyThreadId);
9507c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate            if (gDisableBackgroundScheduling) {
9517c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                if (curPrio > ANDROID_PRIORITY_NORMAL) {
9527c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // We have inherited a reduced priority from the caller, but do not
9537c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // want to run in that state in this process.  The driver set our
9547c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // priority already (though not our scheduling class), so bounce
9557c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // it back to the default before invoking the transaction.
9567c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL);
9577c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                }
9587c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate            } else {
9597c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                if (curPrio >= ANDROID_PRIORITY_BACKGROUND) {
9607c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // We want to use the inherited priority from the caller.
9617c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // Ensure this thread is in the background scheduling class,
9627c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // since the driver won't modify scheduling classes for us.
9637c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // The scheduling group is reset to default by the caller
9647c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    // once this method returns after the transaction is complete.
9657c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                    androidSetThreadSchedulingGroup(mMyThreadId,
9667c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                                                    ANDROID_TGROUP_BG_NONINTERACT);
9677c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate                }
9685f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn            }
9697c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate
9707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            //LOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid);
9717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            Parcel reply;
9737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            IF_LOG_TRANSACTIONS() {
9747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                TextOutput::Bundle _b(alog);
9757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                alog << "BR_TRANSACTION thr " << (void*)pthread_self()
9767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << " / obj " << tr.target.ptr << " / code "
9777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << TypeCode(tr.code) << ": " << indent << buffer
9787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << dedent << endl
9797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << "Data addr = "
9807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer)
9817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << ", offsets addr="
9827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl;
9837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
9847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if (tr.target.ptr) {
9857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                sp<BBinder> b((BBinder*)tr.cookie);
9867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                const status_t error = b->transact(tr.code, buffer, &reply, 0);
9877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                if (error < NO_ERROR) reply.setError(error);
9887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            } else {
9907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                const status_t error = the_context_object->transact(tr.code, buffer, &reply, 0);
9917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                if (error < NO_ERROR) reply.setError(error);
9927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
9937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            //LOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n",
9957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            //     mCallingPid, origPid, origUid);
9967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
9977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            if ((tr.flags & TF_ONE_WAY) == 0) {
9987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                LOG_ONEWAY("Sending reply to %d!", mCallingPid);
9997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                sendReply(reply, 0);
10007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            } else {
10017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                LOG_ONEWAY("NOT sending reply to %d!", mCallingPid);
10027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
10037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mCallingPid = origPid;
10057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mCallingUid = origUid;
10067c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate
10077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            IF_LOG_TRANSACTIONS() {
10087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                TextOutput::Bundle _b(alog);
10097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj "
10107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                    << tr.target.ptr << ": " << indent << reply << dedent << endl;
10117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            }
10127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        }
10147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
10157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_DEAD_BINDER:
10177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        {
10187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            BpBinder *proxy = (BpBinder*)mIn.readInt32();
10197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            proxy->sendObituary();
10207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mOut.writeInt32(BC_DEAD_BINDER_DONE);
10217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            mOut.writeInt32((int32_t)proxy);
10227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
10237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_CLEAR_DEATH_NOTIFICATION_DONE:
10257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        {
10267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            BpBinder *proxy = (BpBinder*)mIn.readInt32();
10277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian            proxy->getWeakRefs()->decWeak(proxy);
10287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        } break;
10297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_FINISHED:
10317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        result = TIMED_OUT;
10327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
10337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_NOOP:
10357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
10367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    case BR_SPAWN_LOOPER:
10387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mProcess->spawnPooledThread(false);
10397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
10407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    default:
10427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        printf("*** BAD COMMAND %d received from Binder driver\n", cmd);
10437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        result = UNKNOWN_ERROR;
10447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        break;
10457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
10467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (result != NO_ERROR) {
10487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        mLastError = result;
10497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
10507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    return result;
10527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
10537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::threadDestructor(void *st)
10557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
10567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian	IPCThreadState* const self = static_cast<IPCThreadState*>(st);
10577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian	if (self) {
10587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian		self->flushCommands();
10597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if defined(HAVE_ANDROID_OS)
10607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0);
10617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif
10627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian		delete self;
10637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian	}
10647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
10657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, size_t dataSize,
10687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                                const size_t* objects, size_t objectsSize,
10697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian                                void* cookie)
10707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{
10717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    //LOGI("Freeing parcel %p", &parcel);
10727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IF_LOG_COMMANDS() {
10737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian        alog << "Writing BC_FREE_BUFFER for " << data << endl;
10747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    }
10757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    LOG_ASSERT(data != NULL, "Called with NULL data");
10767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    if (parcel != NULL) parcel->closeFileDescriptors();
10777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    IPCThreadState* state = self();
10787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    state->mOut.writeInt32(BC_FREE_BUFFER);
10797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian    state->mOut.writeInt32((int32_t)data);
10807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}
10817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian
10827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; // namespace android
1083