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