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