IPCThreadState.cpp revision 0e72fd55c5369bfdb3e61b11f720c5f118fa3031
17922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian/* 27922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Copyright (C) 2005 The Android Open Source Project 37922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * 47922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 57922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * you may not use this file except in compliance with the License. 67922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * You may obtain a copy of the License at 77922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * 87922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 97922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * 107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Unless required by applicable law or agreed to in writing, software 117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * See the License for the specific language governing permissions and 147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * limitations under the License. 157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian */ 167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 172b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks#define LOG_TAG "IPCThreadState" 182b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 194080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/IPCThreadState.h> 207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 214080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/Binder.h> 224080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/BpBinder.h> 234080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/TextOutput.h> 240e72fd55c5369bfdb3e61b11f720c5f118fa3031Chia-I Wu#include <hwbinder/binder_kernel.h> 254ea13dcd270953215f51345e83708c16963d332fMathias Agopian 26cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten#include <cutils/sched_policy.h> 277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Log.h> 28b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross#include <utils/SystemClock.h> 297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/threads.h> 307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <private/binder/binder_module.h> 32e01f4f2b38beb5799dece8742eef5d70d131dbd3Martijn Coenen#include <hwbinder/Static.h> 337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <errno.h> 35b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross#include <inttypes.h> 367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <pthread.h> 377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sched.h> 38bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <signal.h> 39bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <stdio.h> 40bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <sys/ioctl.h> 417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sys/resource.h> 42bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <unistd.h> 437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_NDEBUG 457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_TRANSACTIONS() if (false) 477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_COMMANDS() if (false) 487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_REMOTEREFS(...) 497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_REMOTEREFS() if (false) 507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_THREADPOOL(...) 517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_ONEWAY(...) 527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 555854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_TRANSACTIONS() IF_ALOG(LOG_VERBOSE, "transact") 565854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_COMMANDS() IF_ALOG(LOG_VERBOSE, "ipc") 575854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_REMOTEREFS(...) ALOG(LOG_DEBUG, "remoterefs", __VA_ARGS__) 585854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_REMOTEREFS() IF_ALOG(LOG_DEBUG, "remoterefs") 595854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_THREADPOOL(...) ALOG(LOG_DEBUG, "threadpool", __VA_ARGS__) 605854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_ONEWAY(...) ALOG(LOG_DEBUG, "ipc", __VA_ARGS__) 617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// --------------------------------------------------------------------------- 657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiannamespace android { 67f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenennamespace hardware { 687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx); 707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd); 717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd); 727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7330dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh// Static const and functions will be optimized out if not used, 7430dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh// when LOG_NDEBUG and references in IF_LOG_COMMANDS() are optimized out. 757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kReturnStrings[] = { 76457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_ERROR", 777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_OK", 787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_TRANSACTION", 797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_REPLY", 807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE_RESULT", 817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DEAD_REPLY", 827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_TRANSACTION_COMPLETE", 837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_INCREFS", 847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE", 857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE", 867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DECREFS", 877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE", 887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_NOOP", 897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_SPAWN_LOOPER", 907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_FINISHED", 917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DEAD_BINDER", 92457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_CLEAR_DEATH_NOTIFICATION_DONE", 93457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_FAILED_REPLY" 947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; 957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kCommandStrings[] = { 977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_TRANSACTION", 987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REPLY", 997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE_RESULT", 1007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_FREE_BUFFER", 1017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_INCREFS", 1027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE", 1037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_RELEASE", 1047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_DECREFS", 1057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_INCREFS_DONE", 1067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE_DONE", 1077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ATTEMPT_ACQUIRE", 1087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REGISTER_LOOPER", 1097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ENTER_LOOPER", 1107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_EXIT_LOOPER", 1117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REQUEST_DEATH_NOTIFICATION", 1127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_CLEAR_DEATH_NOTIFICATION", 1137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_DEAD_BINDER_DONE" 1147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; 1157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx) 1177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (idx < sizeof(kReturnStrings) / sizeof(kReturnStrings[0])) 1197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return kReturnStrings[idx]; 1207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 1217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return "unknown"; 1227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printBinderTransactionData(TextOutput& out, const void* data) 1257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const binder_transaction_data* btd = 1277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (const binder_transaction_data*)data; 128457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (btd->target.handle < 1024) { 129457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden /* want to print descriptors in decimal; guess based on value */ 130457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << "target.desc=" << btd->target.handle; 131457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } else { 132457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << "target.ptr=" << btd->target.ptr; 133457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } 134457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << " (cookie " << btd->cookie << ")" << endl 13530dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh << "code=" << TypeCode(btd->code) << ", flags=" << (void*)(long)btd->flags << endl 1367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "data=" << btd->data.ptr.buffer << " (" << (void*)btd->data_size 1377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " bytes)" << endl 1387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "offsets=" << btd->data.ptr.offsets << " (" << (void*)btd->offsets_size 139457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden << " bytes)"; 1407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return btd+1; 1417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd) 1447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 145457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden static const size_t N = sizeof(kReturnStrings)/sizeof(kReturnStrings[0]); 1467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t* cmd = (const int32_t*)_cmd; 147b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t code = (uint32_t)*cmd++; 148457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden size_t cmdIndex = code & 0xff; 149b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer if (code == BR_ERROR) { 15030dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << "BR_ERROR: " << (void*)(long)(*cmd++) << endl; 1517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 152457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } else if (cmdIndex >= N) { 1537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "Unknown reply: " << code << endl; 1547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 1557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 156457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << kReturnStrings[cmdIndex]; 1577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (code) { 1597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 1607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: { 1617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << indent; 1627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = (const int32_t *)printBinderTransactionData(out, cmd); 1637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << dedent; 1647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: { 1677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t res = *cmd++; 1687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)"); 1697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 1727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 1737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 1747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: { 1757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 1767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 17730dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": target=" << (void*)(long)b << " (cookie " << (void*)(long)c << ")"; 1787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: { 1817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t p = *cmd++; 1827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 1837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 18430dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": target=" << (void*)(long)b << " (cookie " << (void*)(long)c 1857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "), pri=" << p; 1867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 1897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: { 1907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 19130dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": death cookie " << (void*)(long)c; 1927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 193457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 194457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden default: 195457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // no details to show for: BR_OK, BR_DEAD_REPLY, 196457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // BR_TRANSACTION_COMPLETE, BR_FINISHED 197457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden break; 1987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << endl; 2017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 2037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd) 2057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 206457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden static const size_t N = sizeof(kCommandStrings)/sizeof(kCommandStrings[0]); 2077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t* cmd = (const int32_t*)_cmd; 208b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t code = (uint32_t)*cmd++; 209457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden size_t cmdIndex = code & 0xff; 210457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 211457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (cmdIndex >= N) { 2127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "Unknown command: " << code << endl; 2137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 215457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << kCommandStrings[cmdIndex]; 216457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 2177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (code) { 2187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_TRANSACTION: 2197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_REPLY: { 2207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << indent; 2217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = (const int32_t *)printBinderTransactionData(out, cmd); 2227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << dedent; 2237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE_RESULT: { 2267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t res = *cmd++; 2277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)"); 2287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_FREE_BUFFER: { 2317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t buf = *cmd++; 23230dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": buffer=" << (void*)(long)buf; 2337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_INCREFS: 2367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE: 2377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_RELEASE: 2387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_DECREFS: { 2397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t d = *cmd++; 240457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << ": desc=" << d; 2417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_INCREFS_DONE: 2447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE_DONE: { 2457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 2467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 24730dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": target=" << (void*)(long)b << " (cookie " << (void*)(long)c << ")"; 2487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ATTEMPT_ACQUIRE: { 2517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t p = *cmd++; 2527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t d = *cmd++; 253457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << ": desc=" << d << ", pri=" << p; 2547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_REQUEST_DEATH_NOTIFICATION: 2577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_CLEAR_DEATH_NOTIFICATION: { 2587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t h = *cmd++; 2597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 26030dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": handle=" << h << " (death cookie " << (void*)(long)c << ")"; 2617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_DEAD_BINDER_DONE: { 2647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 26530dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": death cookie " << (void*)(long)c; 2667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 267457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 268457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden default: 269457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // no details to show for: BC_REGISTER_LOOPER, BC_ENTER_LOOPER, 270457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // BC_EXIT_LOOPER 271457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden break; 2727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 2737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << endl; 2757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 2777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER; 2797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gHaveTLS = false; 2807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_key_t gTLS = 0; 2817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gShutdown = false; 2825f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornstatic bool gDisableBackgroundScheduling = false; 2837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState* IPCThreadState::self() 2857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 2867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gHaveTLS) { 2877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianrestart: 2887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pthread_key_t k = gTLS; 2897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 2907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (st) return st; 2917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return new IPCThreadState; 2927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 2937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2941d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe if (gShutdown) { 2951d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe ALOGW("Calling IPCThreadState::self() during shutdown is dangerous, expect a crash.\n"); 2961d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe return NULL; 2971d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe } 2987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_lock(&gTLSMutex); 3007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!gHaveTLS) { 3011d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe int key_create_value = pthread_key_create(&gTLS, threadDestructor); 3021d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe if (key_create_value != 0) { 3037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_unlock(&gTLSMutex); 3041d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe ALOGW("IPCThreadState::self() unable to create TLS key, expect a crash: %s\n", 3051d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe strerror(key_create_value)); 3067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NULL; 3077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gHaveTLS = true; 3097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_unlock(&gTLSMutex); 3117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto restart; 3127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3147794994fc8947b65730108aa4700b109c268bb6dBrad FitzpatrickIPCThreadState* IPCThreadState::selfOrNull() 3157794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick{ 3167794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick if (gHaveTLS) { 3177794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick const pthread_key_t k = gTLS; 3187794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 3197794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick return st; 3207794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick } 3217794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick return NULL; 3227794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick} 3237794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick 3247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::shutdown() 3257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gShutdown = true; 3277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gHaveTLS) { 3297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // XXX Need to wait for all thread pool threads to exit! 3307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* st = (IPCThreadState*)pthread_getspecific(gTLS); 3317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (st) { 3327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian delete st; 3337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, NULL); 3347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3358e8a025a6587a97e3ed048b47a02575551f4db43zhongjie pthread_key_delete(gTLS); 3367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gHaveTLS = false; 3377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3405f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornvoid IPCThreadState::disableBackgroundScheduling(bool disable) 3415f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn{ 3425f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn gDisableBackgroundScheduling = disable; 3435f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn} 3445f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn 3457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiansp<ProcessState> IPCThreadState::process() 3467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mProcess; 3487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearLastError() 3517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = mLastError; 3537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = NO_ERROR; 3547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 3557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 357e8da8a4d96938fbe2db67928f176ab11d341ac31Dan Stozapid_t IPCThreadState::getCallingPid() const 3587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mCallingPid; 3607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 362e8da8a4d96938fbe2db67928f176ab11d341ac31Dan Stozauid_t IPCThreadState::getCallingUid() const 3637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mCallingUid; 3657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianint64_t IPCThreadState::clearCallingIdentity() 3687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid; 3707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian clearCaller(); 3717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return token; 3727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 37494c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrickvoid IPCThreadState::setStrictModePolicy(int32_t policy) 37594c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick{ 37694c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick mStrictModePolicy = policy; 37794c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick} 37894c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick 3793f4ef59401d7c2115c273ab1e76c221da22cf8d0Brad Fitzpatrickint32_t IPCThreadState::getStrictModePolicy() const 3803f4ef59401d7c2115c273ab1e76c221da22cf8d0Brad Fitzpatrick{ 38194c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick return mStrictModePolicy; 38294c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick} 38394c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick 38424f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrickvoid IPCThreadState::setLastTransactionBinderFlags(int32_t flags) 38524f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick{ 38624f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mLastTransactionBinderFlags = flags; 38724f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick} 38824f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 38924f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrickint32_t IPCThreadState::getLastTransactionBinderFlags() const 39024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick{ 39124f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick return mLastTransactionBinderFlags; 39224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick} 39324f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 3947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::restoreCallingIdentity(int64_t token) 3957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = (int)(token>>32); 3977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = (int)token; 3987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::clearCaller() 4017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 402b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen mCallingPid = getpid(); 403b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen mCallingUid = getuid(); 4047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::flushCommands() 4077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 4087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mProcess->mDriverFD <= 0) 4097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return; 4107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 4117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4132e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwalevoid IPCThreadState::blockUntilThreadAvailable() 4142e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale{ 4152e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_lock(&mProcess->mThreadCountLock); 4162e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale while (mProcess->mExecutingThreadsCount >= mProcess->mMaxThreads) { 417319900a48d6dfdb230d5eba0658ef92682145339Wale Ogunwale ALOGW("Waiting for thread to be free. mExecutingThreadsCount=%lu mMaxThreads=%lu\n", 418319900a48d6dfdb230d5eba0658ef92682145339Wale Ogunwale static_cast<unsigned long>(mProcess->mExecutingThreadsCount), 419319900a48d6dfdb230d5eba0658ef92682145339Wale Ogunwale static_cast<unsigned long>(mProcess->mMaxThreads)); 4202e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_cond_wait(&mProcess->mThreadCountDecrement, &mProcess->mThreadCountLock); 4212e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale } 4222e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4232e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale} 4242e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale 4250646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::getAndExecuteCommand() 4260646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4270646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 4280646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor int32_t cmd; 4290646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4300646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = talkWithDriver(); 4310646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result >= NO_ERROR) { 4320646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor size_t IN = mIn.dataAvail(); 4330646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (IN < sizeof(int32_t)) return result; 4340646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor cmd = mIn.readInt32(); 4350646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IF_LOG_COMMANDS() { 4360646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor alog << "Processing top-level Command: " 4370646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << getReturnString(cmd) << endl; 4380646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4390646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4402e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_lock(&mProcess->mThreadCountLock); 4412e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale mProcess->mExecutingThreadsCount++; 442b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross if (mProcess->mExecutingThreadsCount >= mProcess->mMaxThreads && 443b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs == 0) { 444b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs = uptimeMillis(); 445b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 4462e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4472e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale 4480646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = executeCommand(cmd); 4490646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4502e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_lock(&mProcess->mThreadCountLock); 4512e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale mProcess->mExecutingThreadsCount--; 452b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross if (mProcess->mExecutingThreadsCount < mProcess->mMaxThreads && 453b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs != 0) { 454b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross int64_t starvationTimeMs = uptimeMillis() - mProcess->mStarvationStartTimeMs; 455b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross if (starvationTimeMs > 100) { 456b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross ALOGE("binder thread pool (%zu threads) starved for %" PRId64 " ms", 457b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mMaxThreads, starvationTimeMs); 458b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 459b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs = 0; 460b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 4612e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_cond_broadcast(&mProcess->mThreadCountDecrement); 4622e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4632e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale 4640646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // After executing the command, ensure that the thread is returned to the 4650646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // foreground cgroup before rejoining the pool. The driver takes care of 4660646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // restoring the priority, but doesn't do anything with cgroups so we 4670646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // need to take care of that here in userspace. Note that we do make 4680646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // sure to go in the foreground after executing a transaction, but 4690646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // there are other callbacks into user code that could have changed 4700646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // our group so we want to make absolutely sure it is put back. 4710646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor set_sched_policy(mMyThreadId, SP_FOREGROUND); 4720646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4730646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4740646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 4750646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 4760646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4770646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor// When we've cleared the incoming command queue, process any pending derefs 4780646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorvoid IPCThreadState::processPendingDerefs() 4790646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4800646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mIn.dataPosition() >= mIn.dataSize()) { 4810646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor size_t numPending = mPendingWeakDerefs.size(); 4820646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (numPending > 0) { 4830646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor for (size_t i = 0; i < numPending; i++) { 4840646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor RefBase::weakref_type* refs = mPendingWeakDerefs[i]; 4850646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor refs->decWeak(mProcess.get()); 4860646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4870646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mPendingWeakDerefs.clear(); 4880646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4890646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4900646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor numPending = mPendingStrongDerefs.size(); 4910646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (numPending > 0) { 4920646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor for (size_t i = 0; i < numPending; i++) { 4930646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor BBinder* obj = mPendingStrongDerefs[i]; 4940646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor obj->decStrong(mProcess.get()); 4950646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4960646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mPendingStrongDerefs.clear(); 4970646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4980646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4990646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5000646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::joinThreadPool(bool isMain) 5027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 5037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid()); 5047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); 5067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5075f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn // This thread may have been spawned by a thread that was in the background 508cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten // scheduling group, so first we will make sure it is in the foreground 5095f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn // one to avoid performing an initial transaction in the background. 510cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten set_sched_policy(mMyThreadId, SP_FOREGROUND); 5115f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn 5127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result; 5137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 5140646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 5157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // now get the next command to be processed, waiting if necessary 5160646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 5172b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 5180646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result < NO_ERROR && result != TIMED_OUT && result != -ECONNREFUSED && result != -EBADF) { 5190646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor ALOGE("getAndExecuteCommand(fd=%d) returned unexpected error %d, aborting", 520ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker mProcess->mDriverFD, result); 521ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker abort(); 5227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Let this thread exit the thread pool if it is no longer 5257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // needed and it is not the main process thread. 5267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if(result == TIMED_OUT && !isMain) { 5277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 5287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (result != -ECONNREFUSED && result != -EBADF); 5307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%p\n", 5327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (void*)pthread_self(), getpid(), (void*)result); 5337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_EXIT_LOOPER); 5357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 5367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5380646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorint IPCThreadState::setupPolling(int* fd) 5390646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5400646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mProcess->mDriverFD <= 0) { 5410646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return -EBADF; 5420646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 5430646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5440646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mOut.writeInt32(BC_ENTER_LOOPER); 5450646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor *fd = mProcess->mDriverFD; 5460646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return 0; 5470646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5480646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5490646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::handlePolledCommands() 5500646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5510646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 5520646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5530646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor do { 5540646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 5550646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } while (mIn.dataPosition() < mIn.dataSize()); 5560646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5570646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 5580646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor flushCommands(); 5590646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 5600646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5610646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 562f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::stopProcess(bool /*immediate*/) 5637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 56493cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("**** STOPPING PROCESS"); 5657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flushCommands(); 5667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int fd = mProcess->mDriverFD; 5677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->mDriverFD = -1; 5687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian close(fd); 5697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian //kill(getpid(), SIGKILL); 5707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::transact(int32_t handle, 5737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian uint32_t code, const Parcel& data, 5747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel* reply, uint32_t flags) 5757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 5767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err = data.errorCheck(); 5777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flags |= TF_ACCEPT_FDS; 5797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 5817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand " 5827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << " / code " << TypeCode(code) << ": " 5837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << indent << data << dedent << endl; 5847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 5877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(), 5887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY"); 589d39a168ff68941c13c5bfc78b5d113c22ef0fd51Martijn Coenen err = writeTransactionData(BC_TRANSACTION_SG, flags, handle, code, data, NULL); 5907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 5937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 5947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 5957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((flags & TF_ONE_WAY) == 0) { 5989887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 5999887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 60093cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction 4"); 6019887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 60293cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction %d", code); 6039887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 6049887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 6057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 6067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(reply); 6077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 6087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel fakeReply; 6097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(&fakeReply); 6107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6119887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 6129887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 61393cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction 4"); 6149887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 61593cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction %d", code); 6169887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 6179887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 6187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 6207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand " 6217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << ": "; 6227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) alog << indent << *reply << dedent << endl; 6237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else alog << "(none requested)" << endl; 6247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 6267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(NULL, NULL); 6277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 6307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incStrongHandle(int32_t handle) 6337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle); 6357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE); 6367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decStrongHandle(int32_t handle) 6407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle); 6427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_RELEASE); 6437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incWeakHandle(int32_t handle) 6477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle); 6497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS); 6507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decWeakHandle(int32_t handle) 6547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle); 6567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DECREFS); 6577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::attemptIncStrongHandle(int32_t handle) 6617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 662304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#if HAS_BC_ATTEMPT_ACQUIRE 663457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden LOG_REMOTEREFS("IPCThreadState::attemptIncStrongHandle(%d)\n", handle); 6647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ATTEMPT_ACQUIRE); 6657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(0); // xxx was thread priority 6667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = UNKNOWN_ERROR; 6687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian waitForResponse(NULL, &result); 6707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n", 6737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian handle, result == NO_ERROR ? "SUCCESS" : "FAILURE"); 6747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 6757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 677304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#else 678304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg (void)handle; 679304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg ALOGE("%s(%d): Not supported\n", __func__, handle); 680304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg return INVALID_OPERATION; 681304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#endif 6827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::expungeHandle(int32_t handle, IBinder* binder) 6857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::expungeHandle(%ld)\n", handle); 6887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 6897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian self()->mProcess->expungeHandle(handle, binder); 6907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::requestDeathNotification(int32_t handle, BpBinder* proxy) 6937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION); 6957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 6964ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 6977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 6987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy) 7017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION); 7037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 7044ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 7057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 7067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::IPCThreadState() 70924f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick : mProcess(ProcessState::self()), 71007cf48a1aaa0601c837024d159599ed9de19f5a9Elliott Hughes mMyThreadId(gettid()), 71124f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mStrictModePolicy(0), 71224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mLastTransactionBinderFlags(0) 7137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, this); 7155f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn clearCaller(); 7167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataCapacity(256); 7177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataCapacity(256); 7187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::~IPCThreadState() 7217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags) 7257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 7277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t statusBuffer; 728d39a168ff68941c13c5bfc78b5d113c22ef0fd51Martijn Coenen err = writeTransactionData(BC_REPLY_SG, flags, -1, 0, reply, &statusBuffer); 7297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) return err; 7307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return waitForResponse(NULL, NULL); 7327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) 7357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 736b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t cmd; 7377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t err; 7387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (1) { 7407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((err=talkWithDriver()) < NO_ERROR) break; 7417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.errorCheck(); 7427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) break; 7437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mIn.dataAvail() == 0) continue; 7447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 745b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer cmd = (uint32_t)mIn.readInt32(); 7467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 7487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Processing waitForResponse Command: " 7497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << getReturnString(cmd) << endl; 7507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (cmd) { 7537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION_COMPLETE: 7547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!reply && !acquireResult) goto finish; 7557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 7567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_REPLY: 7587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = DEAD_OBJECT; 7597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FAILED_REPLY: 7627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = FAILED_TRANSACTION; 7637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: 7667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 767d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT"); 7687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t result = mIn.readInt32(); 7697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!acquireResult) continue; 7707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *acquireResult = result ? NO_ERROR : INVALID_OPERATION; 7717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: 7757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 7767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 7777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.read(&tr, sizeof(tr)); 778d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY"); 7797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 7807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 7827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_STATUS_CODE) == 0) { 7837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reply->ipcSetDataReference( 7847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 786a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 787a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), 7887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer, this); 7897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 790a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg err = *reinterpret_cast<const status_t*>(tr.data.ptr.buffer); 7917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 794a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 795a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 7967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 7987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 8007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 801a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 802a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 8037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian continue; 8047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 8077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 8097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = executeCommand(cmd); 8107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 8117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 8127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianfinish: 8167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 8177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (acquireResult) *acquireResult = err; 8187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 8197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = err; 8207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 8237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 8247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::talkWithDriver(bool doReceive) 8267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 827597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 828597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson return -EBADF; 829597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 8307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_write_read bwr; 8327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Is the read buffer empty? 8347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool needRead = mIn.dataPosition() >= mIn.dataSize(); 8357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // We don't want to write anything if we are still reading 8377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // from data left in the input buffer and the caller 8387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // has requested to read the next data. 8397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0; 8407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_size = outAvail; 842a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.write_buffer = (uintptr_t)mOut.data(); 8437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // This is what we'll read. 8457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (doReceive && needRead) { 8467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = mIn.dataCapacity(); 847a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.read_buffer = (uintptr_t)mIn.data(); 8487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 8497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = 0; 850455a70a568f5fa2351d31a64e390246b2e4c4d3eBen Cheng bwr.read_buffer = 0; 8517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 852457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (outAvail != 0) { 8557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Sending commands to driver: " << indent; 8567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = (const void*)bwr.write_buffer; 8577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = ((const uint8_t*)cmds)+bwr.write_size; 8587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, bwr.write_size) << endl; 8597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printCommand(alog, cmds); 8607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 8617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Size of receive buffer: " << bwr.read_size 8637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", needRead: " << needRead << ", doReceive: " << doReceive << endl; 8647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Return immediately if there is nothing to do. 8677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR; 868457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_consumed = 0; 8707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_consumed = 0; 8717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 8727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 8737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "About to read/write, write size = " << mOut.dataSize() << endl; 8757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 876e5e7055dcbfcabfdd735318a0d712e07544a523aElliott Hughes#if defined(__ANDROID__) 8777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0) 8787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = NO_ERROR; 8797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 8807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = -errno; 8817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 8827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = INVALID_OPERATION; 8837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 884597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 885597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson err = -EBADF; 886597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 8877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Finished read/write, write size = " << mOut.dataSize() << endl; 8897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (err == -EINTR); 891457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 893f04879896beb41f2455017ace482283bc2ef321cColin Cross alog << "Our err: " << (void*)(intptr_t)err << ", write consumed: " 8947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << bwr.write_consumed << " (of " << mOut.dataSize() 8950646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << "), read consumed: " << bwr.read_consumed << endl; 8967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err >= NO_ERROR) { 8997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.write_consumed > 0) { 900a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg if (bwr.write_consumed < mOut.dataSize()) 9017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.remove(0, bwr.write_consumed); 9027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 9037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataSize(0); 9047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.read_consumed > 0) { 9067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataSize(bwr.read_consumed); 9077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataPosition(0); 9087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 9107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Remaining data size: " << mOut.dataSize() << endl; 9117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Received commands from driver: " << indent; 9127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = mIn.data(); 9137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = mIn.data() + mIn.dataSize(); 9147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, mIn.dataSize()) << endl; 9157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printReturnCommand(alog, cmds); 9167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 9177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 9227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags, 9257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer) 9267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 927fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen binder_transaction_data_sg tr_sg; 928fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.target.ptr = 0; /* Don't pass uninitialized stack data to a remote process */ 929fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.target.handle = handle; 930fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.code = code; 931fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.flags = binderFlags; 932fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.cookie = 0; 933fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.sender_pid = 0; 934fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.sender_euid = 0; 9357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = data.errorCheck(); 9377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 938fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data_size = data.ipcDataSize(); 939fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.buffer = data.ipcData(); 940fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.offsets_size = data.ipcObjectsCount()*sizeof(binder_size_t); 941fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.offsets = data.ipcObjects(); 942fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.buffers_size = data.ipcBufferSize(); 9437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else if (statusBuffer) { 944fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.flags |= TF_STATUS_CODE; 9457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *statusBuffer = err; 946fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data_size = sizeof(status_t); 947fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.buffer = reinterpret_cast<uintptr_t>(statusBuffer); 948fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.offsets_size = 0; 949fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.offsets = 0; 950fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.buffers_size = 0; 9517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 9527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 9537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(cmd); 956fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen mOut.write(&tr_sg, sizeof(tr_sg)); 9577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 961a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenenvoid IPCThreadState::setTheContextObject(sp<BBinder> obj) 9627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 963a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenen mContextObject = obj; 9647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::executeCommand(int32_t cmd) 9677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 9687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian BBinder* obj; 9697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian RefBase::weakref_type* refs; 9707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = NO_ERROR; 971b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer switch ((uint32_t)cmd) { 9727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ERROR: 9737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.readInt32(); 9747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_OK: 9777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 9804ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 9814ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 982d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE: object %p does not match cookie %p (expected %p)", 9847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 9857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->incStrong(mProcess.get()); 9867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 9877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj); 9887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 9897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_DONE); 9914ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 9924ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 9937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 9964ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 9974ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 998d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE: object %p does not match cookie %p (expected %p)", 10007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 10017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 10027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj); 10037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 10047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingStrongDerefs.push(obj); 10067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 10077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 10094ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 10104ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 10117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs->incWeak(mProcess.get()); 10127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS_DONE); 10134ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 10144ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 10157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 10167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: 10184ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 10194ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 10207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // NOTE: This assertion is not valid, because the object may no 10217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // longer exist (thus the (BBinder*)cast above resulting in a different 10227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // memory address). 1023d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block //ALOG_ASSERT(refs->refBase() == obj, 10247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // "BR_DECREFS: object %p does not match cookie %p (expected %p)", 10257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // refs, obj, refs->refBase()); 10267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingWeakDerefs.push(refs); 10277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 10287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: 10304ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 10314ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 10327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool success = refs->attemptIncStrong(mProcess.get()); 1035d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(success && refs->refBase() == obj, 10367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)", 10377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 10387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_RESULT); 10407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)success); 10417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 10437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 10457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 10477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.read(&tr, sizeof(tr)); 1048d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(result == NO_ERROR, 10497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "Not enough command data for brTRANSACTION"); 10507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) break; 10517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel buffer; 10537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian buffer.ipcSetDataReference( 10547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 10557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 1056a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 1057a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), freeBuffer, this); 10587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pid_t origPid = mCallingPid; 10607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const uid_t origUid = mCallingUid; 1061f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn const int32_t origStrictModePolicy = mStrictModePolicy; 1062f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn const int32_t origTransactionBinderFlags = mLastTransactionBinderFlags; 1063f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = tr.sender_pid; 10657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = tr.sender_euid; 1066f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mLastTransactionBinderFlags = tr.flags; 1067f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10687c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate int curPrio = getpriority(PRIO_PROCESS, mMyThreadId); 10697c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate if (gDisableBackgroundScheduling) { 10707c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate if (curPrio > ANDROID_PRIORITY_NORMAL) { 10717c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // We have inherited a reduced priority from the caller, but do not 10727c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // want to run in that state in this process. The driver set our 10737c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // priority already (though not our scheduling class), so bounce 10747c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // it back to the default before invoking the transaction. 10757c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL); 10767c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate } 10777c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate } else { 10787c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate if (curPrio >= ANDROID_PRIORITY_BACKGROUND) { 10797c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // We want to use the inherited priority from the caller. 10807c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // Ensure this thread is in the background scheduling class, 10817c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // since the driver won't modify scheduling classes for us. 10827c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // The scheduling group is reset to default by the caller 10837c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // once this method returns after the transaction is complete. 1084cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten set_sched_policy(mMyThreadId, SP_BACKGROUND); 10857c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate } 10865f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn } 10877c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate 108893cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid); 1089f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel reply; 1091f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn status_t error; 109279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen bool reply_sent = false; 10937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 10947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_TRANSACTION thr " << (void*)pthread_self() 10957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " / obj " << tr.target.ptr << " / code " 10967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << TypeCode(tr.code) << ": " << indent << buffer 10977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << dedent << endl 10987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "Data addr = " 10997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer) 11007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", offsets addr=" 11017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl; 11027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 110379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 110479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen auto reply_callback = [&] (auto &replyParcel) { 110579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (reply_sent) { 110679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Reply was sent earlier, ignore it. 110779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("Dropping binder reply, it was sent already."); 110879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen return; 110979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 111079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen reply_sent = true; 111179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if ((tr.flags & TF_ONE_WAY) == 0) { 111279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen replyParcel.setError(NO_ERROR); 111379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen sendReply(replyParcel, 0); 111479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 111579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("Not sending reply in one-way transaction"); 111679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 111779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen }; 111879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 11197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (tr.target.ptr) { 1120839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn // We only have a weak reference on the target object, so we must first try to 1121839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn // safely acquire a strong reference before doing anything else with it. 1122839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn if (reinterpret_cast<RefBase::weakref_type*>( 1123839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn tr.target.ptr)->attemptIncStrong(this)) { 1124839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn error = reinterpret_cast<BBinder*>(tr.cookie)->transact(tr.code, buffer, 112579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen &reply, tr.flags, reply_callback); 1126839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn reinterpret_cast<BBinder*>(tr.cookie)->decStrong(this); 1127839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn } else { 1128839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn error = UNKNOWN_TRANSACTION; 1129839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn } 113024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 11317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 1132a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenen error = mContextObject->transact(tr.code, buffer, &reply, tr.flags, reply_callback); 11337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1134f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 11357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_ONE_WAY) == 0) { 113679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (!reply_sent) { 113779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Should have been a reply but there wasn't, so there 113879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // must have been an error instead. 113979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen reply.setError(error); 114079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen sendReply(reply, 0); 114179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 114279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (error != NO_ERROR) { 114379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("transact() returned error after sending reply."); 114479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 114579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Ok, reply sent and transact didn't return an error. 114679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 114779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 11487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 114979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // One-way transaction, don't care about return value or reply. 11507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 115179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 115279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen //ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n", 115379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // mCallingPid, origPid, origUid); 115479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 11557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = origPid; 11577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = origUid; 1158f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mStrictModePolicy = origStrictModePolicy; 1159f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mLastTransactionBinderFlags = origTransactionBinderFlags; 11607c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate 11617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 11627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj " 11637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << tr.target.ptr << ": " << indent << reply << dedent << endl; 11647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 11707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11714ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu BpBinder *proxy = (BpBinder*)mIn.readPointer(); 11727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->sendObituary(); 11737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DEAD_BINDER_DONE); 11744ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 11757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 11767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: 11787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11794ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu BpBinder *proxy = (BpBinder*)mIn.readPointer(); 11807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->getWeakRefs()->decWeak(proxy); 11817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 11827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FINISHED: 11847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = TIMED_OUT; 11857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_NOOP: 11887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_SPAWN_LOOPER: 11917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->spawnPooledThread(false); 11927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 11957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("*** BAD COMMAND %d received from Binder driver\n", cmd); 11967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = UNKNOWN_ERROR; 11977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 12007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) { 12017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = result; 12027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 12037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 12047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 12057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 12067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 12077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::threadDestructor(void *st) 12087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 12090646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IPCThreadState* const self = static_cast<IPCThreadState*>(st); 12100646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (self) { 12110646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor self->flushCommands(); 1212e5e7055dcbfcabfdd735318a0d712e07544a523aElliott Hughes#if defined(__ANDROID__) 1213597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (self->mProcess->mDriverFD > 0) { 1214597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0); 1215597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 12167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 12170646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor delete self; 12180646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 12197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 12207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 12217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1222f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, 1223f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*dataSize*/, 1224f04879896beb41f2455017ace482283bc2ef321cColin Cross const binder_size_t* /*objects*/, 1225f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*objectsSize*/, void* /*cookie*/) 12267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 122793cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("Freeing parcel %p", &parcel); 12287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 12297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Writing BC_FREE_BUFFER for " << data << endl; 12307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1231d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(data != NULL, "Called with NULL data"); 12327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (parcel != NULL) parcel->closeFileDescriptors(); 12337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* state = self(); 12347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian state->mOut.writeInt32(BC_FREE_BUFFER); 12354ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu state->mOut.writePointer((uintptr_t)data); 12367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 12377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1238f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen}; // namespace hardware 12397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; // namespace android 1240