IPCThreadState.cpp revision df7f40d43c85b342b9bed680a43c2acdd631aefb
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 17c4dd210df92f8d58adae5e27631be4d92cba0c43Steven Moreland#define LOG_TAG "hw-IPCThreadState" 182b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 194080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/IPCThreadState.h> 207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 214080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/Binder.h> 221e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong#include <hwbinder/BpHwBinder.h> 234080edcfb5810a4a1817c03740f5f1bb19815ae1Martijn Coenen#include <hwbinder/TextOutput.h> 240e72fd55c5369bfdb3e61b11f720c5f118fa3031Chia-I Wu#include <hwbinder/binder_kernel.h> 254ea13dcd270953215f51345e83708c16963d332fMathias Agopian 267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Log.h> 27b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross#include <utils/SystemClock.h> 287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/threads.h> 297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <private/binder/binder_module.h> 31e01f4f2b38beb5799dece8742eef5d70d131dbd3Martijn Coenen#include <hwbinder/Static.h> 327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <errno.h> 34b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross#include <inttypes.h> 357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <pthread.h> 367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sched.h> 37bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <signal.h> 38bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <stdio.h> 39bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <sys/ioctl.h> 407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sys/resource.h> 41bbef2baee419a27bc8e8c40e80e296b145e2c9abYabin Cui#include <unistd.h> 427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_NDEBUG 447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_TRANSACTIONS() if (false) 467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_COMMANDS() if (false) 47dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong#define LOG_REMOTEREFS(...) 487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_REMOTEREFS() if (false) 49dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong#define LOG_THREADPOOL(...) 50dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong#define LOG_ONEWAY(...) 517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 545854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_TRANSACTIONS() IF_ALOG(LOG_VERBOSE, "transact") 555854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_COMMANDS() IF_ALOG(LOG_VERBOSE, "ipc") 565854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_REMOTEREFS(...) ALOG(LOG_DEBUG, "remoterefs", __VA_ARGS__) 575854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_REMOTEREFS() IF_ALOG(LOG_DEBUG, "remoterefs") 585854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_THREADPOOL(...) ALOG(LOG_DEBUG, "threadpool", __VA_ARGS__) 595854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_ONEWAY(...) ALOG(LOG_DEBUG, "ipc", __VA_ARGS__) 607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// --------------------------------------------------------------------------- 647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiannamespace android { 66f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenennamespace hardware { 677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6830dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh// Static const and functions will be optimized out if not used, 6930dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh// when LOG_NDEBUG and references in IF_LOG_COMMANDS() are optimized out. 707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kReturnStrings[] = { 71457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_ERROR", 727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_OK", 737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_TRANSACTION", 747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_REPLY", 757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE_RESULT", 767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DEAD_REPLY", 777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_TRANSACTION_COMPLETE", 787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_INCREFS", 797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE", 807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE", 817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DECREFS", 827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE", 837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_NOOP", 847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_SPAWN_LOOPER", 857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_FINISHED", 867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DEAD_BINDER", 87457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_CLEAR_DEATH_NOTIFICATION_DONE", 88457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_FAILED_REPLY" 897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; 907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kCommandStrings[] = { 927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_TRANSACTION", 937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REPLY", 947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE_RESULT", 957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_FREE_BUFFER", 967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_INCREFS", 977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE", 987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_RELEASE", 997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_DECREFS", 1007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_INCREFS_DONE", 1017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE_DONE", 1027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ATTEMPT_ACQUIRE", 1037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REGISTER_LOOPER", 1047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ENTER_LOOPER", 1057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_EXIT_LOOPER", 1067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REQUEST_DEATH_NOTIFICATION", 1077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_CLEAR_DEATH_NOTIFICATION", 1087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_DEAD_BINDER_DONE" 1097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; 1107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx) 1127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (idx < sizeof(kReturnStrings) / sizeof(kReturnStrings[0])) 1147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return kReturnStrings[idx]; 1157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 1167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return "unknown"; 1177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printBinderTransactionData(TextOutput& out, const void* data) 1207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const binder_transaction_data* btd = 1227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (const binder_transaction_data*)data; 123457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (btd->target.handle < 1024) { 124457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden /* want to print descriptors in decimal; guess based on value */ 125457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << "target.desc=" << btd->target.handle; 126457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } else { 127457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << "target.ptr=" << btd->target.ptr; 128457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } 129457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << " (cookie " << btd->cookie << ")" << endl 13030dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh << "code=" << TypeCode(btd->code) << ", flags=" << (void*)(long)btd->flags << endl 1317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "data=" << btd->data.ptr.buffer << " (" << (void*)btd->data_size 1327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " bytes)" << endl 1337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "offsets=" << btd->data.ptr.offsets << " (" << (void*)btd->offsets_size 134457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden << " bytes)"; 1357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return btd+1; 1367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd) 1397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 140457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden static const size_t N = sizeof(kReturnStrings)/sizeof(kReturnStrings[0]); 1417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t* cmd = (const int32_t*)_cmd; 142b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t code = (uint32_t)*cmd++; 143457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden size_t cmdIndex = code & 0xff; 144b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer if (code == BR_ERROR) { 14530dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << "BR_ERROR: " << (void*)(long)(*cmd++) << endl; 1467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 147457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } else if (cmdIndex >= N) { 1487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "Unknown reply: " << code << endl; 1497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 1507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 151457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << kReturnStrings[cmdIndex]; 152dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 1537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (code) { 1547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 1557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: { 1567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << indent; 1577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = (const int32_t *)printBinderTransactionData(out, cmd); 1587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << dedent; 1597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 160dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 1617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: { 1627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t res = *cmd++; 1637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)"); 1647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 165dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 1667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 1677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 1687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 1697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: { 1707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 1717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 17230dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": target=" << (void*)(long)b << " (cookie " << (void*)(long)c << ")"; 1737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 174dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 1757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: { 1767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t p = *cmd++; 1777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 1787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 17930dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": target=" << (void*)(long)b << " (cookie " << (void*)(long)c 1807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "), pri=" << p; 1817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 1847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: { 1857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 18630dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": death cookie " << (void*)(long)c; 1877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 188457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 189457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden default: 190457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // no details to show for: BR_OK, BR_DEAD_REPLY, 191457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // BR_TRANSACTION_COMPLETE, BR_FINISHED 192457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden break; 1937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 194dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 1957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << endl; 1967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 1977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd) 2007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 201457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden static const size_t N = sizeof(kCommandStrings)/sizeof(kCommandStrings[0]); 2027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t* cmd = (const int32_t*)_cmd; 203b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t code = (uint32_t)*cmd++; 204457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden size_t cmdIndex = code & 0xff; 205457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 206457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (cmdIndex >= N) { 2077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "Unknown command: " << code << endl; 2087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 210457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << kCommandStrings[cmdIndex]; 211457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 2127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (code) { 2137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_TRANSACTION: 2147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_REPLY: { 2157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << indent; 2167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = (const int32_t *)printBinderTransactionData(out, cmd); 2177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << dedent; 2187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 219dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE_RESULT: { 2217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t res = *cmd++; 2227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)"); 2237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 224dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_FREE_BUFFER: { 2267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t buf = *cmd++; 22730dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": buffer=" << (void*)(long)buf; 2287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 229dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_INCREFS: 2317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE: 2327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_RELEASE: 2337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_DECREFS: { 2347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t d = *cmd++; 235457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << ": desc=" << d; 2367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 237dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_INCREFS_DONE: 2397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE_DONE: { 2407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 2417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 24230dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": target=" << (void*)(long)b << " (cookie " << (void*)(long)c << ")"; 2437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 244dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ATTEMPT_ACQUIRE: { 2467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t p = *cmd++; 2477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t d = *cmd++; 248457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << ": desc=" << d << ", pri=" << p; 2497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 250dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_REQUEST_DEATH_NOTIFICATION: 2527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_CLEAR_DEATH_NOTIFICATION: { 2537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t h = *cmd++; 2547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 25530dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": handle=" << h << " (death cookie " << (void*)(long)c << ")"; 2567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_DEAD_BINDER_DONE: { 2597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 26030dcad775deba8134cbbcb93a9b15412f9b1d2a0Chih-Hung Hsieh out << ": death cookie " << (void*)(long)c; 2617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 262457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 263457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden default: 264457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // no details to show for: BC_REGISTER_LOOPER, BC_ENTER_LOOPER, 265457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // BC_EXIT_LOOPER 266457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden break; 2677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 268dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << endl; 2707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 2727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER; 2747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gHaveTLS = false; 2757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_key_t gTLS = 0; 2767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gShutdown = false; 2775f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornstatic bool gDisableBackgroundScheduling = false; 2787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState* IPCThreadState::self() 2807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 2817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gHaveTLS) { 2827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianrestart: 2837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pthread_key_t k = gTLS; 2847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 2857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (st) return st; 2867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return new IPCThreadState; 2877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 288dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2891d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe if (gShutdown) { 2901d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe ALOGW("Calling IPCThreadState::self() during shutdown is dangerous, expect a crash.\n"); 2911d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe return NULL; 2921d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe } 293dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 2947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_lock(&gTLSMutex); 2957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!gHaveTLS) { 2961d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe int key_create_value = pthread_key_create(&gTLS, threadDestructor); 2971d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe if (key_create_value != 0) { 2987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_unlock(&gTLSMutex); 2991d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe ALOGW("IPCThreadState::self() unable to create TLS key, expect a crash: %s\n", 3001d5dc2bf97110aa3a00236afc64018dfe79b97d8Andreas Gampe strerror(key_create_value)); 3017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NULL; 3027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gHaveTLS = true; 3047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_unlock(&gTLSMutex); 3067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto restart; 3077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3097794994fc8947b65730108aa4700b109c268bb6dBrad FitzpatrickIPCThreadState* IPCThreadState::selfOrNull() 3107794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick{ 3117794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick if (gHaveTLS) { 3127794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick const pthread_key_t k = gTLS; 3137794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 3147794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick return st; 3157794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick } 3167794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick return NULL; 3177794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick} 3187794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick 3197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::shutdown() 3207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gShutdown = true; 322dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 3237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gHaveTLS) { 3247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // XXX Need to wait for all thread pool threads to exit! 3257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* st = (IPCThreadState*)pthread_getspecific(gTLS); 3267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (st) { 3277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian delete st; 3287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, NULL); 3297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3308e8a025a6587a97e3ed048b47a02575551f4db43zhongjie pthread_key_delete(gTLS); 3317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gHaveTLS = false; 3327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3355f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornvoid IPCThreadState::disableBackgroundScheduling(bool disable) 3365f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn{ 3375f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn gDisableBackgroundScheduling = disable; 3385f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn} 3395f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn 3407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiansp<ProcessState> IPCThreadState::process() 3417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mProcess; 3437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearLastError() 3467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = mLastError; 3487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = NO_ERROR; 3497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 3507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 352e8da8a4d96938fbe2db67928f176ab11d341ac31Dan Stozapid_t IPCThreadState::getCallingPid() const 3537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mCallingPid; 3557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 357e8da8a4d96938fbe2db67928f176ab11d341ac31Dan Stozauid_t IPCThreadState::getCallingUid() const 3587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mCallingUid; 3607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianint64_t IPCThreadState::clearCallingIdentity() 3637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid; 3657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian clearCaller(); 3667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return token; 3677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 36994c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrickvoid IPCThreadState::setStrictModePolicy(int32_t policy) 37094c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick{ 37194c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick mStrictModePolicy = policy; 37294c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick} 37394c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick 3743f4ef59401d7c2115c273ab1e76c221da22cf8d0Brad Fitzpatrickint32_t IPCThreadState::getStrictModePolicy() const 3753f4ef59401d7c2115c273ab1e76c221da22cf8d0Brad Fitzpatrick{ 37694c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick return mStrictModePolicy; 37794c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick} 37894c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick 37924f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrickvoid IPCThreadState::setLastTransactionBinderFlags(int32_t flags) 38024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick{ 38124f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mLastTransactionBinderFlags = flags; 38224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick} 38324f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 38424f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrickint32_t IPCThreadState::getLastTransactionBinderFlags() const 38524f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick{ 38624f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick return mLastTransactionBinderFlags; 38724f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick} 38824f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 3897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::restoreCallingIdentity(int64_t token) 3907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = (int)(token>>32); 3927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = (int)token; 3937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::clearCaller() 3967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 397b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen mCallingPid = getpid(); 398b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen mCallingUid = getuid(); 3997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::flushCommands() 4027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 4037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mProcess->mDriverFD <= 0) 4047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return; 4057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 4067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4082e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwalevoid IPCThreadState::blockUntilThreadAvailable() 4092e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale{ 4102e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_lock(&mProcess->mThreadCountLock); 4112e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale while (mProcess->mExecutingThreadsCount >= mProcess->mMaxThreads) { 412319900a48d6dfdb230d5eba0658ef92682145339Wale Ogunwale ALOGW("Waiting for thread to be free. mExecutingThreadsCount=%lu mMaxThreads=%lu\n", 413319900a48d6dfdb230d5eba0658ef92682145339Wale Ogunwale static_cast<unsigned long>(mProcess->mExecutingThreadsCount), 414319900a48d6dfdb230d5eba0658ef92682145339Wale Ogunwale static_cast<unsigned long>(mProcess->mMaxThreads)); 4152e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_cond_wait(&mProcess->mThreadCountDecrement, &mProcess->mThreadCountLock); 4162e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale } 4172e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4182e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale} 4192e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale 4200646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::getAndExecuteCommand() 4210646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4220646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 4230646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor int32_t cmd; 4240646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4250646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = talkWithDriver(); 4260646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result >= NO_ERROR) { 4270646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor size_t IN = mIn.dataAvail(); 4280646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (IN < sizeof(int32_t)) return result; 4290646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor cmd = mIn.readInt32(); 4300646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IF_LOG_COMMANDS() { 4310646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor alog << "Processing top-level Command: " 4320646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << getReturnString(cmd) << endl; 4330646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4340646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4352e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_lock(&mProcess->mThreadCountLock); 4362e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale mProcess->mExecutingThreadsCount++; 437b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross if (mProcess->mExecutingThreadsCount >= mProcess->mMaxThreads && 4380ce07ce06005048eeef327af14b8958878e1aad7Martijn Coenen mProcess->mMaxThreads > 1 && mProcess->mStarvationStartTimeMs == 0) { 439b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs = uptimeMillis(); 440b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 4412e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4422e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale 4430646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = executeCommand(cmd); 4440646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4452e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_lock(&mProcess->mThreadCountLock); 4462e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale mProcess->mExecutingThreadsCount--; 447df7f40d43c85b342b9bed680a43c2acdd631aefbWei Wang if (mProcess->mExecutingThreadsCount < mProcess->mMaxThreads && 4480ce07ce06005048eeef327af14b8958878e1aad7Martijn Coenen mProcess->mStarvationStartTimeMs != 0) { 449b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross int64_t starvationTimeMs = uptimeMillis() - mProcess->mStarvationStartTimeMs; 450b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross if (starvationTimeMs > 100) { 451df7f40d43c85b342b9bed680a43c2acdd631aefbWei Wang // If there is only a single-threaded client, nobody would be blocked 452df7f40d43c85b342b9bed680a43c2acdd631aefbWei Wang // on this, and it's not really starvation. (see b/37647467) 453df7f40d43c85b342b9bed680a43c2acdd631aefbWei Wang ALOGW("All binder threads in pool (%zu threads) busy for %" PRId64 " ms%s", 454df7f40d43c85b342b9bed680a43c2acdd631aefbWei Wang mProcess->mMaxThreads, starvationTimeMs, 455df7f40d43c85b342b9bed680a43c2acdd631aefbWei Wang mProcess->mMaxThreads > 1 ? "" : " (may be a false alarm)"); 456b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 457b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs = 0; 458b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 4592e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_cond_broadcast(&mProcess->mThreadCountDecrement); 4602e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4610646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4620646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4630646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 4640646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 4650646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4660646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor// When we've cleared the incoming command queue, process any pending derefs 4670646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorvoid IPCThreadState::processPendingDerefs() 4680646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4690646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mIn.dataPosition() >= mIn.dataSize()) { 470c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen /* 471c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * The decWeak()/decStrong() calls may cause a destructor to run, 472c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * which in turn could have initiated an outgoing transaction, 473c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * which in turn could cause us to add to the pending refs 474c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * vectors; so instead of simply iterating, loop until they're empty. 475c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * 476c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * We do this in an outer loop, because calling decStrong() 477c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * may result in something being added to mPendingWeakDerefs, 478c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * which could be delayed until the next incoming command 479c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen * from the driver if we don't process it now. 480c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen */ 481c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen while (mPendingWeakDerefs.size() > 0 || mPendingStrongDerefs.size() > 0) { 482c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen while (mPendingWeakDerefs.size() > 0) { 483c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen RefBase::weakref_type* refs = mPendingWeakDerefs[0]; 484c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen mPendingWeakDerefs.removeAt(0); 4850646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor refs->decWeak(mProcess.get()); 4860646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4870646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 488c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen if (mPendingStrongDerefs.size() > 0) { 489c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen // We don't use while() here because we don't want to re-order 490c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen // strong and weak decs at all; if this decStrong() causes both a 491c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen // decWeak() and a decStrong() to be queued, we want to process 492c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen // the decWeak() first. 493c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen BHwBinder* obj = mPendingStrongDerefs[0]; 494c9f105ba3a7355b833a3c01b3a0cfb641fc07979Martijn Coenen mPendingStrongDerefs.removeAt(0); 4950646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor obj->decStrong(mProcess.get()); 4960646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 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); 506dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result; 508420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenen mIsLooper = true; 5097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 5100646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 5117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // now get the next command to be processed, waiting if necessary 5120646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 5132b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 5140646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result < NO_ERROR && result != TIMED_OUT && result != -ECONNREFUSED && result != -EBADF) { 5150646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor ALOGE("getAndExecuteCommand(fd=%d) returned unexpected error %d, aborting", 516ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker mProcess->mDriverFD, result); 517ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker abort(); 5187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 519dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Let this thread exit the thread pool if it is no longer 5217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // needed and it is not the main process thread. 5227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if(result == TIMED_OUT && !isMain) { 5237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 5247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (result != -ECONNREFUSED && result != -EBADF); 5267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5278a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%d\n", 5288a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang (void*)pthread_self(), getpid(), result); 529dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_EXIT_LOOPER); 531420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenen mIsLooper = false; 5327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 5337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5350646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorint IPCThreadState::setupPolling(int* fd) 5360646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5370646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mProcess->mDriverFD <= 0) { 5380646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return -EBADF; 5390646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 5400646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 54180b88ab21170f7fde645212a9f6b6d7e28a40de4Martijn Coenen // Tells the kernel to not spawn any additional binder threads, 54280b88ab21170f7fde645212a9f6b6d7e28a40de4Martijn Coenen // as that won't work with polling. Also, the caller is responsible 54380b88ab21170f7fde645212a9f6b6d7e28a40de4Martijn Coenen // for subsequently calling handlePolledCommands() 54480b88ab21170f7fde645212a9f6b6d7e28a40de4Martijn Coenen mProcess->setThreadPoolConfiguration(1, true /* callerWillJoin */); 545a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskog mIsPollingThread = true; 54680b88ab21170f7fde645212a9f6b6d7e28a40de4Martijn Coenen 5470646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mOut.writeInt32(BC_ENTER_LOOPER); 5480646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor *fd = mProcess->mDriverFD; 5490646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return 0; 5500646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5510646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5520646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::handlePolledCommands() 5530646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5540646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 5550646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5560646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor do { 5570646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 5580646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } while (mIn.dataPosition() < mIn.dataSize()); 5590646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5600646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 5610646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor flushCommands(); 5620646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 5630646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5640646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 565f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::stopProcess(bool /*immediate*/) 5667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 56793cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("**** STOPPING PROCESS"); 5687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flushCommands(); 5697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int fd = mProcess->mDriverFD; 5707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->mDriverFD = -1; 5717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian close(fd); 5727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian //kill(getpid(), SIGKILL); 5737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::transact(int32_t handle, 5767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian uint32_t code, const Parcel& data, 5777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel* reply, uint32_t flags) 5787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 579ce45b8956abc22667c4b59621c5a983d1e19f6d7Ganesh Mahendran status_t err; 5807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flags |= TF_ACCEPT_FDS; 5827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 5847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand " 5857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << " / code " << TypeCode(code) << ": " 5867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << indent << data << dedent << endl; 5877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 588dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 589ce45b8956abc22667c4b59621c5a983d1e19f6d7Ganesh Mahendran LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(), 590ce45b8956abc22667c4b59621c5a983d1e19f6d7Ganesh Mahendran (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY"); 591ce45b8956abc22667c4b59621c5a983d1e19f6d7Ganesh Mahendran err = writeTransactionData(BC_TRANSACTION_SG, flags, handle, code, data, NULL); 592dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 5947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 5957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 5967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 597dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((flags & TF_ONE_WAY) == 0) { 5999887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 6009887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 60193cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction 4"); 6029887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 60393cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction %d", code); 6049887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 6059887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 6067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 6077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(reply); 6087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 6097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel fakeReply; 6107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(&fakeReply); 6117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6129887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 6139887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 61493cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction 4"); 6159887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 61693cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction %d", code); 6179887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 6189887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 619dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 6217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand " 6227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << ": "; 6237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) alog << indent << *reply << dedent << endl; 6247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else alog << "(none requested)" << endl; 6257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 6277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(NULL, NULL); 6287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 629dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 6317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incStrongHandle(int32_t handle) 6347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle); 6367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE); 6377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decStrongHandle(int32_t handle) 6417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle); 6437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_RELEASE); 6447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incWeakHandle(int32_t handle) 6487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle); 6507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS); 6517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decWeakHandle(int32_t handle) 6557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle); 6577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DECREFS); 6587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::attemptIncStrongHandle(int32_t handle) 6627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 663304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#if HAS_BC_ATTEMPT_ACQUIRE 664457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden LOG_REMOTEREFS("IPCThreadState::attemptIncStrongHandle(%d)\n", handle); 6657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ATTEMPT_ACQUIRE); 6667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(0); // xxx was thread priority 6677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = UNKNOWN_ERROR; 669dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian waitForResponse(NULL, &result); 671dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n", 6747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian handle, result == NO_ERROR ? "SUCCESS" : "FAILURE"); 6757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 676dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 678304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#else 679304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg (void)handle; 680304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg ALOGE("%s(%d): Not supported\n", __func__, handle); 681304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg return INVALID_OPERATION; 682304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#endif 6837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::expungeHandle(int32_t handle, IBinder* binder) 6867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::expungeHandle(%ld)\n", handle); 6897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 6906b65ac3d560d8d4c3289d56ad4b8e99e13805558Yunlian Jiang self()->mProcess->expungeHandle(handle, binder); // NOLINT 6917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6931e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t IPCThreadState::requestDeathNotification(int32_t handle, BpHwBinder* proxy) 6947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION); 6967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 6974ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 6987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 6997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7011e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t IPCThreadState::clearDeathNotification(int32_t handle, BpHwBinder* proxy) 7027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION); 7047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 7054ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 7067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 7077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::IPCThreadState() 71024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick : mProcess(ProcessState::self()), 71107cf48a1aaa0601c837024d159599ed9de19f5a9Elliott Hughes mMyThreadId(gettid()), 71224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mStrictModePolicy(0), 7139bd3d3bdc14465cdf86c5c28f9def6c43202a239Martijn Coenen mLastTransactionBinderFlags(0), 714a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskog mIsLooper(false), 715a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskog mIsPollingThread(false) { 7167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, this); 7175f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn clearCaller(); 7187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataCapacity(256); 7197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataCapacity(256); 72029dbdcf1087e2d60c5898233aff0bb444147c4ffChih-Hung Hsieh 72129dbdcf1087e2d60c5898233aff0bb444147c4ffChih-Hung Hsieh // TODO(b/67742352): remove this variable from the class 72229dbdcf1087e2d60c5898233aff0bb444147c4ffChih-Hung Hsieh (void)mMyThreadId; 7237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::~IPCThreadState() 7267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags) 7307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 7327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t statusBuffer; 733d39a168ff68941c13c5bfc78b5d113c22ef0fd51Martijn Coenen err = writeTransactionData(BC_REPLY_SG, flags, -1, 0, reply, &statusBuffer); 7347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) return err; 735dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return waitForResponse(NULL, NULL); 7377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) 7407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 741b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t cmd; 7427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t err; 7437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (1) { 7457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((err=talkWithDriver()) < NO_ERROR) break; 7467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.errorCheck(); 7477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) break; 7487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mIn.dataAvail() == 0) continue; 749dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 750b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer cmd = (uint32_t)mIn.readInt32(); 751dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 7537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Processing waitForResponse Command: " 7547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << getReturnString(cmd) << endl; 7557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (cmd) { 7587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION_COMPLETE: 7597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!reply && !acquireResult) goto finish; 7607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 761dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_REPLY: 7637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = DEAD_OBJECT; 7647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FAILED_REPLY: 7677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = FAILED_TRANSACTION; 7687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 769dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: 7717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 772d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT"); 7737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t result = mIn.readInt32(); 7747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!acquireResult) continue; 7757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *acquireResult = result ? NO_ERROR : INVALID_OPERATION; 7767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 778dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: 7807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 7817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 7827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.read(&tr, sizeof(tr)); 783d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY"); 7847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 7857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 7877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_STATUS_CODE) == 0) { 7887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reply->ipcSetDataReference( 7897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 791a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 792a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), 7937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer, this); 7947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 795a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg err = *reinterpret_cast<const status_t*>(tr.data.ptr.buffer); 7967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 799a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 800a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 8017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 8037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 8047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 8057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 806a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 807a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 8087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian continue; 8097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 8127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 8147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = executeCommand(cmd); 8157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 8167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 8177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianfinish: 8217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 8227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (acquireResult) *acquireResult = err; 8237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 8247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = err; 8257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 826dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 8287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 8297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::talkWithDriver(bool doReceive) 8317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 832597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 833597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson return -EBADF; 834597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 835dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_write_read bwr; 837dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Is the read buffer empty? 8397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool needRead = mIn.dataPosition() >= mIn.dataSize(); 840dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // We don't want to write anything if we are still reading 8427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // from data left in the input buffer and the caller 8437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // has requested to read the next data. 8447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0; 845dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_size = outAvail; 847a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.write_buffer = (uintptr_t)mOut.data(); 8487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // This is what we'll read. 8507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (doReceive && needRead) { 8517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = mIn.dataCapacity(); 852a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.read_buffer = (uintptr_t)mIn.data(); 8537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 8547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = 0; 855455a70a568f5fa2351d31a64e390246b2e4c4d3eBen Cheng bwr.read_buffer = 0; 8567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 857457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (outAvail != 0) { 8607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Sending commands to driver: " << indent; 8617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = (const void*)bwr.write_buffer; 8627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = ((const uint8_t*)cmds)+bwr.write_size; 8637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, bwr.write_size) << endl; 8647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printCommand(alog, cmds); 8657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 8667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Size of receive buffer: " << bwr.read_size 8687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", needRead: " << needRead << ", doReceive: " << doReceive << endl; 8697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 870dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Return immediately if there is nothing to do. 8727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR; 873457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_consumed = 0; 8757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_consumed = 0; 8767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 8777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 8787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "About to read/write, write size = " << mOut.dataSize() << endl; 8807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 881e5e7055dcbfcabfdd735318a0d712e07544a523aElliott Hughes#if defined(__ANDROID__) 8827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0) 8837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = NO_ERROR; 8847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 8857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = -errno; 8867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 8877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = INVALID_OPERATION; 8887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 889597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 890597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson err = -EBADF; 891597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 8927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Finished read/write, write size = " << mOut.dataSize() << endl; 8947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (err == -EINTR); 896457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 898f04879896beb41f2455017ace482283bc2ef321cColin Cross alog << "Our err: " << (void*)(intptr_t)err << ", write consumed: " 8997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << bwr.write_consumed << " (of " << mOut.dataSize() 9000646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << "), read consumed: " << bwr.read_consumed << endl; 9017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err >= NO_ERROR) { 9047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.write_consumed > 0) { 905a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg if (bwr.write_consumed < mOut.dataSize()) 9067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.remove(0, bwr.write_consumed); 9077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 9087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataSize(0); 9097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.read_consumed > 0) { 9117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataSize(bwr.read_consumed); 9127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataPosition(0); 9137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 9157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Remaining data size: " << mOut.dataSize() << endl; 9167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Received commands from driver: " << indent; 9177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = mIn.data(); 9187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = mIn.data() + mIn.dataSize(); 9197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, mIn.dataSize()) << endl; 9207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printReturnCommand(alog, cmds); 9217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 9227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 925dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 9277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags, 9307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer) 9317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 932fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen binder_transaction_data_sg tr_sg; 933678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris /* Don't pass uninitialized stack data to a remote process */ 934678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.target.ptr = 0; 935678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.target.handle = handle; 936678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.code = code; 937678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.flags = binderFlags; 938678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.cookie = 0; 939678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.sender_pid = 0; 940678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.sender_euid = 0; 941dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = data.errorCheck(); 9437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 944678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.data_size = data.ipcDataSize(); 945678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.data.ptr.buffer = data.ipcData(); 946678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.offsets_size = data.ipcObjectsCount()*sizeof(binder_size_t); 947678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.data.ptr.offsets = data.ipcObjects(); 948fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.buffers_size = data.ipcBufferSize(); 9497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else if (statusBuffer) { 950678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.flags |= TF_STATUS_CODE; 9517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *statusBuffer = err; 952678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.data_size = sizeof(status_t); 953678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.data.ptr.buffer = reinterpret_cast<uintptr_t>(statusBuffer); 954678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.offsets_size = 0; 955678434faa9c4e3891d98a0aa4f5d0ad74009cf35Christopher Ferris tr_sg.transaction_data.data.ptr.offsets = 0; 956fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.buffers_size = 0; 9577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 9587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 9597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 960dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(cmd); 962fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen mOut.write(&tr_sg, sizeof(tr_sg)); 963dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 967dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hongvoid IPCThreadState::setTheContextObject(sp<BHwBinder> obj) 9687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 969a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenen mContextObject = obj; 9707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 972420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenenbool IPCThreadState::isLooperThread() 973420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenen{ 974420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenen return mIsLooper; 975420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenen} 976420d4bb0e8977eef2c66a5a88688dbe2e59cd6ebMartijn Coenen 977a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskogbool IPCThreadState::isOnlyBinderThread() { 978a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskog return (mIsLooper && mProcess->mMaxThreads <= 1) || mIsPollingThread; 979a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskog} 980a36d576f20a31a117cb6f5c316e4446ae7b2fa35Tobias Lindskog 9817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::executeCommand(int32_t cmd) 9827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 983dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong BHwBinder* obj; 9847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian RefBase::weakref_type* refs; 9857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = NO_ERROR; 986b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer switch ((uint32_t)cmd) { 9877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ERROR: 9887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.readInt32(); 9897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 990dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_OK: 9927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 993dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 9954ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 996dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 997d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE: object %p does not match cookie %p (expected %p)", 9997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 10007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->incStrong(mProcess.get()); 10017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 10027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj); 10037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 10047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_DONE); 10064ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 10074ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 10087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1009dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 10114ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 1012dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 1013d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 10147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE: object %p does not match cookie %p (expected %p)", 10157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 10167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 10177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj); 10187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 10197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingStrongDerefs.push(obj); 10217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1022dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 10244ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 1025dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 10267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs->incWeak(mProcess.get()); 10277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS_DONE); 10284ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 10294ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 10307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1031dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: 10334ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 1034dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 10357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // NOTE: This assertion is not valid, because the object may no 1036dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong // longer exist (thus the (BHwBinder*)cast above resulting in a different 10377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // memory address). 1038d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block //ALOG_ASSERT(refs->refBase() == obj, 10397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // "BR_DECREFS: object %p does not match cookie %p (expected %p)", 10407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // refs, obj, refs->refBase()); 10417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingWeakDerefs.push(refs); 10427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1043dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: 10454ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 1046dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 1047dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool success = refs->attemptIncStrong(mProcess.get()); 1050d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(success && refs->refBase() == obj, 10517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)", 10527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 1053dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_RESULT); 10557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)success); 10567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1058dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 10607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 10627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.read(&tr, sizeof(tr)); 1063d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(result == NO_ERROR, 10647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "Not enough command data for brTRANSACTION"); 10657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) break; 1066dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel buffer; 10687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian buffer.ipcSetDataReference( 10697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 10707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 1071a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 1072a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), freeBuffer, this); 1073dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pid_t origPid = mCallingPid; 10757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const uid_t origUid = mCallingUid; 1076f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn const int32_t origStrictModePolicy = mStrictModePolicy; 1077f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn const int32_t origTransactionBinderFlags = mLastTransactionBinderFlags; 1078f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = tr.sender_pid; 10807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = tr.sender_euid; 1081f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mLastTransactionBinderFlags = tr.flags; 1082f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 108393cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid); 1084f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel reply; 1086f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn status_t error; 108779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen bool reply_sent = false; 10887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 10897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_TRANSACTION thr " << (void*)pthread_self() 10907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " / obj " << tr.target.ptr << " / code " 10917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << TypeCode(tr.code) << ": " << indent << buffer 10927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << dedent << endl 10937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "Data addr = " 10947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer) 10957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", offsets addr=" 10967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl; 10977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 109879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 109979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen auto reply_callback = [&] (auto &replyParcel) { 110079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (reply_sent) { 110179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Reply was sent earlier, ignore it. 110279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("Dropping binder reply, it was sent already."); 110379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen return; 110479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 110579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen reply_sent = true; 110679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if ((tr.flags & TF_ONE_WAY) == 0) { 110779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen replyParcel.setError(NO_ERROR); 110879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen sendReply(replyParcel, 0); 110979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 111079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("Not sending reply in one-way transaction"); 111179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 111279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen }; 111379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 11147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (tr.target.ptr) { 1115839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn // We only have a weak reference on the target object, so we must first try to 1116839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn // safely acquire a strong reference before doing anything else with it. 1117839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn if (reinterpret_cast<RefBase::weakref_type*>( 1118839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn tr.target.ptr)->attemptIncStrong(this)) { 1119dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong error = reinterpret_cast<BHwBinder*>(tr.cookie)->transact(tr.code, buffer, 112079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen &reply, tr.flags, reply_callback); 1121dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong reinterpret_cast<BHwBinder*>(tr.cookie)->decStrong(this); 1122839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn } else { 1123839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn error = UNKNOWN_TRANSACTION; 1124839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn } 112524f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 11267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 1127a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenen error = mContextObject->transact(tr.code, buffer, &reply, tr.flags, reply_callback); 11287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1129f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 11307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_ONE_WAY) == 0) { 113179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (!reply_sent) { 113279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Should have been a reply but there wasn't, so there 113379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // must have been an error instead. 113479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen reply.setError(error); 113579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen sendReply(reply, 0); 113679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 113779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (error != NO_ERROR) { 113879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("transact() returned error after sending reply."); 113979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 114079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Ok, reply sent and transact didn't return an error. 114179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 114279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 11437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 114479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // One-way transaction, don't care about return value or reply. 11457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 114679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 114779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen //ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n", 114879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // mCallingPid, origPid, origUid); 114979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 1150dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = origPid; 11527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = origUid; 1153f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mStrictModePolicy = origStrictModePolicy; 1154f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mLastTransactionBinderFlags = origTransactionBinderFlags; 11557c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate 11567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 11577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj " 11587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << tr.target.ptr << ": " << indent << reply << dedent << endl; 11597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1160dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1163dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 11657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11661e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong BpHwBinder *proxy = (BpHwBinder*)mIn.readPointer(); 11677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->sendObituary(); 11687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DEAD_BINDER_DONE); 11694ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 11707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1171dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: 11737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11741e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong BpHwBinder *proxy = (BpHwBinder*)mIn.readPointer(); 11757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->getWeakRefs()->decWeak(proxy); 11767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1177dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FINISHED: 11797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = TIMED_OUT; 11807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1181dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_NOOP: 11837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1184dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_SPAWN_LOOPER: 11867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->spawnPooledThread(false); 11877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1188dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 11907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("*** BAD COMMAND %d received from Binder driver\n", cmd); 11917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = UNKNOWN_ERROR; 11927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) { 11967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = result; 11977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1198dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 12007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 12017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 12027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::threadDestructor(void *st) 12037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 12040646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IPCThreadState* const self = static_cast<IPCThreadState*>(st); 12050646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (self) { 12060646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor self->flushCommands(); 1207e5e7055dcbfcabfdd735318a0d712e07544a523aElliott Hughes#if defined(__ANDROID__) 1208597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (self->mProcess->mDriverFD > 0) { 1209597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0); 1210597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 12117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 12120646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor delete self; 12130646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 12147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 12157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 12167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1217f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, 1218f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*dataSize*/, 1219f04879896beb41f2455017ace482283bc2ef321cColin Cross const binder_size_t* /*objects*/, 1220f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*objectsSize*/, void* /*cookie*/) 12217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 122293cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("Freeing parcel %p", &parcel); 12237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 12247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Writing BC_FREE_BUFFER for " << data << endl; 12257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1226d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(data != NULL, "Called with NULL data"); 12277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (parcel != NULL) parcel->closeFileDescriptors(); 12287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* state = self(); 12297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian state->mOut.writeInt32(BC_FREE_BUFFER); 12304ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu state->mOut.writePointer((uintptr_t)data); 12317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 12327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1233f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen}; // namespace hardware 12347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; // namespace android 1235