IPCThreadState.cpp revision 0ce07ce06005048eeef327af14b8958878e1aad7
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--; 4470ce07ce06005048eeef327af14b8958878e1aad7Martijn Coenen if (mProcess->mExecutingThreadsCount < mProcess->mMaxThreads && mProcess->mMaxThreads > 1 && 4480ce07ce06005048eeef327af14b8958878e1aad7Martijn Coenen mProcess->mStarvationStartTimeMs != 0) { 449b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross int64_t starvationTimeMs = uptimeMillis() - mProcess->mStarvationStartTimeMs; 450b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross if (starvationTimeMs > 100) { 4510ce07ce06005048eeef327af14b8958878e1aad7Martijn Coenen ALOGW("All binder threads in pool (%zu threads) busy for %" PRId64 " ms", 452b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mMaxThreads, starvationTimeMs); 453b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 454b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross mProcess->mStarvationStartTimeMs = 0; 455b1dc654b9dbf8640605629a64b646ef1577c0db9Colin Cross } 4562e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_cond_broadcast(&mProcess->mThreadCountDecrement); 4572e604f066e712d99b5cd8ba4115f7ed2578d4a5dWale Ogunwale pthread_mutex_unlock(&mProcess->mThreadCountLock); 4580646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4590646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4600646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 4610646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 4620646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4630646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor// When we've cleared the incoming command queue, process any pending derefs 4640646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorvoid IPCThreadState::processPendingDerefs() 4650646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4660646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mIn.dataPosition() >= mIn.dataSize()) { 4670646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor size_t numPending = mPendingWeakDerefs.size(); 4680646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (numPending > 0) { 4690646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor for (size_t i = 0; i < numPending; i++) { 4700646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor RefBase::weakref_type* refs = mPendingWeakDerefs[i]; 4710646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor refs->decWeak(mProcess.get()); 4720646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4730646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mPendingWeakDerefs.clear(); 4740646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4750646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4760646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor numPending = mPendingStrongDerefs.size(); 4770646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (numPending > 0) { 4780646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor for (size_t i = 0; i < numPending; i++) { 479dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong BHwBinder* obj = mPendingStrongDerefs[i]; 4800646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor obj->decStrong(mProcess.get()); 4810646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4820646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mPendingStrongDerefs.clear(); 4830646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4840646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4850646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 4860646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::joinThreadPool(bool isMain) 4887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 4897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid()); 4907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); 492dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 4937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result; 4947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 4950646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 4967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // now get the next command to be processed, waiting if necessary 4970646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 4982b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 4990646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result < NO_ERROR && result != TIMED_OUT && result != -ECONNREFUSED && result != -EBADF) { 5000646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor ALOGE("getAndExecuteCommand(fd=%d) returned unexpected error %d, aborting", 501ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker mProcess->mDriverFD, result); 502ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker abort(); 5037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 504dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Let this thread exit the thread pool if it is no longer 5067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // needed and it is not the main process thread. 5077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if(result == TIMED_OUT && !isMain) { 5087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 5097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (result != -ECONNREFUSED && result != -EBADF); 5117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5128a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%d\n", 5138a2e8ac7b2a44b6f37e209fa186a06326e82661eWei Wang (void*)pthread_self(), getpid(), result); 514dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_EXIT_LOOPER); 5167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 5177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5190646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorint IPCThreadState::setupPolling(int* fd) 5200646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5210646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mProcess->mDriverFD <= 0) { 5220646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return -EBADF; 5230646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 5240646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5250646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mOut.writeInt32(BC_ENTER_LOOPER); 5260646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor *fd = mProcess->mDriverFD; 5270646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return 0; 5280646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5290646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5300646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::handlePolledCommands() 5310646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5320646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 5330646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5340646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor do { 5350646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 5360646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } while (mIn.dataPosition() < mIn.dataSize()); 5370646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5380646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 5390646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor flushCommands(); 5400646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 5410646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5420646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 543f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::stopProcess(bool /*immediate*/) 5447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 54593cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("**** STOPPING PROCESS"); 5467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flushCommands(); 5477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int fd = mProcess->mDriverFD; 5487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->mDriverFD = -1; 5497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian close(fd); 5507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian //kill(getpid(), SIGKILL); 5517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::transact(int32_t handle, 5547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian uint32_t code, const Parcel& data, 5557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel* reply, uint32_t flags) 5567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 5577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err = data.errorCheck(); 5587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flags |= TF_ACCEPT_FDS; 5607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 5627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand " 5637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << " / code " << TypeCode(code) << ": " 5647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << indent << data << dedent << endl; 5657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 566dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 5687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(), 5697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY"); 570d39a168ff68941c13c5bfc78b5d113c22ef0fd51Martijn Coenen err = writeTransactionData(BC_TRANSACTION_SG, flags, handle, code, data, NULL); 5717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 572dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 5747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 5757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 5767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 577dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 5787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((flags & TF_ONE_WAY) == 0) { 5799887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 5809887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 58193cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction 4"); 5829887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 58393cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction %d", code); 5849887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 5859887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 5867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 5877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(reply); 5887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 5897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel fakeReply; 5907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(&fakeReply); 5917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5929887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 5939887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 59493cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction 4"); 5959887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 59693cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction %d", code); 5979887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 5989887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 599dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 6017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand " 6027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << ": "; 6037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) alog << indent << *reply << dedent << endl; 6047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else alog << "(none requested)" << endl; 6057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 6077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(NULL, NULL); 6087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 609dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 6117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incStrongHandle(int32_t handle) 6147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle); 6167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE); 6177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decStrongHandle(int32_t handle) 6217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle); 6237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_RELEASE); 6247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incWeakHandle(int32_t handle) 6287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle); 6307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS); 6317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decWeakHandle(int32_t handle) 6357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle); 6377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DECREFS); 6387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::attemptIncStrongHandle(int32_t handle) 6427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 643304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#if HAS_BC_ATTEMPT_ACQUIRE 644457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden LOG_REMOTEREFS("IPCThreadState::attemptIncStrongHandle(%d)\n", handle); 6457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ATTEMPT_ACQUIRE); 6467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(0); // xxx was thread priority 6477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = UNKNOWN_ERROR; 649dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian waitForResponse(NULL, &result); 651dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n", 6547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian handle, result == NO_ERROR ? "SUCCESS" : "FAILURE"); 6557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 656dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 6577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 658304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#else 659304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg (void)handle; 660304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg ALOGE("%s(%d): Not supported\n", __func__, handle); 661304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg return INVALID_OPERATION; 662304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#endif 6637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::expungeHandle(int32_t handle, IBinder* binder) 6667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::expungeHandle(%ld)\n", handle); 6697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 6707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian self()->mProcess->expungeHandle(handle, binder); 6717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6731e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t IPCThreadState::requestDeathNotification(int32_t handle, BpHwBinder* proxy) 6747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION); 6767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 6774ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 6787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 6797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6811e118d2b86540f7a7d840ec1510337da49f1446cYifan Hongstatus_t IPCThreadState::clearDeathNotification(int32_t handle, BpHwBinder* proxy) 6827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION); 6847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 6854ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 6867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 6877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::IPCThreadState() 69024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick : mProcess(ProcessState::self()), 69107cf48a1aaa0601c837024d159599ed9de19f5a9Elliott Hughes mMyThreadId(gettid()), 69224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mStrictModePolicy(0), 69324f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mLastTransactionBinderFlags(0) 6947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, this); 6965f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn clearCaller(); 6977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataCapacity(256); 6987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataCapacity(256); 6997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::~IPCThreadState() 7027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags) 7067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 7087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t statusBuffer; 709d39a168ff68941c13c5bfc78b5d113c22ef0fd51Martijn Coenen err = writeTransactionData(BC_REPLY_SG, flags, -1, 0, reply, &statusBuffer); 7107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) return err; 711dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return waitForResponse(NULL, NULL); 7137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) 7167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 717b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer uint32_t cmd; 7187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t err; 7197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (1) { 7217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((err=talkWithDriver()) < NO_ERROR) break; 7227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.errorCheck(); 7237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) break; 7247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mIn.dataAvail() == 0) continue; 725dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 726b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer cmd = (uint32_t)mIn.readInt32(); 727dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 7297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Processing waitForResponse Command: " 7307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << getReturnString(cmd) << endl; 7317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (cmd) { 7347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION_COMPLETE: 7357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!reply && !acquireResult) goto finish; 7367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 737dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_REPLY: 7397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = DEAD_OBJECT; 7407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FAILED_REPLY: 7437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = FAILED_TRANSACTION; 7447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 745dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: 7477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 748d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT"); 7497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t result = mIn.readInt32(); 7507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!acquireResult) continue; 7517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *acquireResult = result ? NO_ERROR : INVALID_OPERATION; 7527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 754dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 7557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: 7567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 7577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 7587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.read(&tr, sizeof(tr)); 759d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY"); 7607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 7617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 7637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_STATUS_CODE) == 0) { 7647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reply->ipcSetDataReference( 7657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 767a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 768a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), 7697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer, this); 7707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 771a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg err = *reinterpret_cast<const status_t*>(tr.data.ptr.buffer); 7727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 775a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 776a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 7777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 7797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 782a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 783a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 7847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian continue; 7857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 7907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = executeCommand(cmd); 7917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 7927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 7937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianfinish: 7977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 7987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (acquireResult) *acquireResult = err; 7997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 8007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = err; 8017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 802dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 8047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 8057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::talkWithDriver(bool doReceive) 8077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 808597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 809597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson return -EBADF; 810597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 811dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_write_read bwr; 813dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Is the read buffer empty? 8157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool needRead = mIn.dataPosition() >= mIn.dataSize(); 816dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // We don't want to write anything if we are still reading 8187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // from data left in the input buffer and the caller 8197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // has requested to read the next data. 8207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0; 821dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_size = outAvail; 823a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.write_buffer = (uintptr_t)mOut.data(); 8247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // This is what we'll read. 8267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (doReceive && needRead) { 8277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = mIn.dataCapacity(); 828a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.read_buffer = (uintptr_t)mIn.data(); 8297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 8307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = 0; 831455a70a568f5fa2351d31a64e390246b2e4c4d3eBen Cheng bwr.read_buffer = 0; 8327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 833457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (outAvail != 0) { 8367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Sending commands to driver: " << indent; 8377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = (const void*)bwr.write_buffer; 8387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = ((const uint8_t*)cmds)+bwr.write_size; 8397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, bwr.write_size) << endl; 8407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printCommand(alog, cmds); 8417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 8427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Size of receive buffer: " << bwr.read_size 8447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", needRead: " << needRead << ", doReceive: " << doReceive << endl; 8457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 846dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 8477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Return immediately if there is nothing to do. 8487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR; 849457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_consumed = 0; 8517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_consumed = 0; 8527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 8537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 8547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "About to read/write, write size = " << mOut.dataSize() << endl; 8567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 857e5e7055dcbfcabfdd735318a0d712e07544a523aElliott Hughes#if defined(__ANDROID__) 8587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0) 8597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = NO_ERROR; 8607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 8617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = -errno; 8627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 8637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = INVALID_OPERATION; 8647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 865597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 866597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson err = -EBADF; 867597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 8687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Finished read/write, write size = " << mOut.dataSize() << endl; 8707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (err == -EINTR); 872457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 874f04879896beb41f2455017ace482283bc2ef321cColin Cross alog << "Our err: " << (void*)(intptr_t)err << ", write consumed: " 8757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << bwr.write_consumed << " (of " << mOut.dataSize() 8760646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << "), read consumed: " << bwr.read_consumed << endl; 8777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err >= NO_ERROR) { 8807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.write_consumed > 0) { 881a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg if (bwr.write_consumed < mOut.dataSize()) 8827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.remove(0, bwr.write_consumed); 8837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 8847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataSize(0); 8857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.read_consumed > 0) { 8877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataSize(bwr.read_consumed); 8887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataPosition(0); 8897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Remaining data size: " << mOut.dataSize() << endl; 8927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Received commands from driver: " << indent; 8937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = mIn.data(); 8947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = mIn.data() + mIn.dataSize(); 8957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, mIn.dataSize()) << endl; 8967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printReturnCommand(alog, cmds); 8977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 8987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 901dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 9037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags, 9067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer) 9077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 908fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen binder_transaction_data_sg tr_sg; 909fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.target.ptr = 0; /* Don't pass uninitialized stack data to a remote process */ 910fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.target.handle = handle; 911fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.code = code; 912fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.flags = binderFlags; 913fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.cookie = 0; 914fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.sender_pid = 0; 915fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.sender_euid = 0; 916dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = data.errorCheck(); 9187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 919fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data_size = data.ipcDataSize(); 920fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.buffer = data.ipcData(); 921fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.offsets_size = data.ipcObjectsCount()*sizeof(binder_size_t); 922fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.offsets = data.ipcObjects(); 923fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.buffers_size = data.ipcBufferSize(); 9247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else if (statusBuffer) { 925fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.flags |= TF_STATUS_CODE; 9267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *statusBuffer = err; 927fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data_size = sizeof(status_t); 928fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.buffer = reinterpret_cast<uintptr_t>(statusBuffer); 929fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.offsets_size = 0; 930fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.tr.data.ptr.offsets = 0; 931fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen tr_sg.buffers_size = 0; 9327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 9337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 9347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 935dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(cmd); 937fd51ebbe7e0a9d1fdb2a205350ecdb2aff801785Martijn Coenen mOut.write(&tr_sg, sizeof(tr_sg)); 938dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 942dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hongvoid IPCThreadState::setTheContextObject(sp<BHwBinder> obj) 9437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 944a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenen mContextObject = obj; 9457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::executeCommand(int32_t cmd) 9487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 949dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong BHwBinder* obj; 9507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian RefBase::weakref_type* refs; 9517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = NO_ERROR; 952b184ed0c2835773cf75b88b3330653cc4222ce9aBernhard Rosenkränzer switch ((uint32_t)cmd) { 9537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ERROR: 9547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.readInt32(); 9557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 956dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_OK: 9587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 959dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 9614ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 962dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 963d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE: object %p does not match cookie %p (expected %p)", 9657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 9667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->incStrong(mProcess.get()); 9677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 9687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj); 9697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 9707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_DONE); 9724ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 9734ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 9747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 975dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 9774ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 978dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 979d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE: object %p does not match cookie %p (expected %p)", 9817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 9827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 9837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj); 9847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 9857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingStrongDerefs.push(obj); 9877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 988dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 9904ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 991dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 9927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs->incWeak(mProcess.get()); 9937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS_DONE); 9944ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 9954ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 9967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 997dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 9987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: 9994ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 1000dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 10017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // NOTE: This assertion is not valid, because the object may no 1002dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong // longer exist (thus the (BHwBinder*)cast above resulting in a different 10037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // memory address). 1004d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block //ALOG_ASSERT(refs->refBase() == obj, 10057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // "BR_DECREFS: object %p does not match cookie %p (expected %p)", 10067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // refs, obj, refs->refBase()); 10077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingWeakDerefs.push(refs); 10087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1009dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: 10114ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 1012dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong obj = (BHwBinder*)mIn.readPointer(); 1013dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool success = refs->attemptIncStrong(mProcess.get()); 1016d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(success && refs->refBase() == obj, 10177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)", 10187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 1019dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_RESULT); 10217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)success); 10227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1024dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 10267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 10287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.read(&tr, sizeof(tr)); 1029d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(result == NO_ERROR, 10307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "Not enough command data for brTRANSACTION"); 10317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) break; 1032dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel buffer; 10347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian buffer.ipcSetDataReference( 10357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 10367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 1037a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 1038a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), freeBuffer, this); 1039dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 10407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pid_t origPid = mCallingPid; 10417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const uid_t origUid = mCallingUid; 1042f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn const int32_t origStrictModePolicy = mStrictModePolicy; 1043f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn const int32_t origTransactionBinderFlags = mLastTransactionBinderFlags; 1044f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = tr.sender_pid; 10467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = tr.sender_euid; 1047f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mLastTransactionBinderFlags = tr.flags; 1048f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 104993cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid); 1050f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel reply; 1052f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn status_t error; 105379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen bool reply_sent = false; 10547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 10557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_TRANSACTION thr " << (void*)pthread_self() 10567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " / obj " << tr.target.ptr << " / code " 10577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << TypeCode(tr.code) << ": " << indent << buffer 10587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << dedent << endl 10597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "Data addr = " 10607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer) 10617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", offsets addr=" 10627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl; 10637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 106479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 106579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen auto reply_callback = [&] (auto &replyParcel) { 106679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (reply_sent) { 106779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Reply was sent earlier, ignore it. 106879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("Dropping binder reply, it was sent already."); 106979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen return; 107079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 107179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen reply_sent = true; 107279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if ((tr.flags & TF_ONE_WAY) == 0) { 107379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen replyParcel.setError(NO_ERROR); 107479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen sendReply(replyParcel, 0); 107579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 107679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("Not sending reply in one-way transaction"); 107779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 107879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen }; 107979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 10807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (tr.target.ptr) { 1081839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn // We only have a weak reference on the target object, so we must first try to 1082839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn // safely acquire a strong reference before doing anything else with it. 1083839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn if (reinterpret_cast<RefBase::weakref_type*>( 1084839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn tr.target.ptr)->attemptIncStrong(this)) { 1085dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong error = reinterpret_cast<BHwBinder*>(tr.cookie)->transact(tr.code, buffer, 108679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen &reply, tr.flags, reply_callback); 1087dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong reinterpret_cast<BHwBinder*>(tr.cookie)->decStrong(this); 1088839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn } else { 1089839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn error = UNKNOWN_TRANSACTION; 1090839f707a38ed15685da48bbd5f4458817b5a54c6Dianne Hackborn } 109124f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 10927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 1093a660cbcab5c8c9b53c1d022d8a11a0c384237569Martijn Coenen error = mContextObject->transact(tr.code, buffer, &reply, tr.flags, reply_callback); 10947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1095f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn 10967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_ONE_WAY) == 0) { 109779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (!reply_sent) { 109879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Should have been a reply but there wasn't, so there 109979c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // must have been an error instead. 110079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen reply.setError(error); 110179c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen sendReply(reply, 0); 110279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 110379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen if (error != NO_ERROR) { 110479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen ALOGE("transact() returned error after sending reply."); 110579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } else { 110679c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // Ok, reply sent and transact didn't return an error. 110779c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 110879c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen } 11097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 111079c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // One-way transaction, don't care about return value or reply. 11117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 111279c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 111379c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen //ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n", 111479c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen // mCallingPid, origPid, origUid); 111579c2f4d38c83ac8fe4c9c77e98e04f310016e7a6Martijn Coenen 1116dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = origPid; 11187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = origUid; 1119f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mStrictModePolicy = origStrictModePolicy; 1120f99aec6a0cff674e0a010cf5789beb4cf4be592dDianne Hackborn mLastTransactionBinderFlags = origTransactionBinderFlags; 11217c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate 11227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 11237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj " 11247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << tr.target.ptr << ": " << indent << reply << dedent << endl; 11257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1126dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1129dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 11317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11321e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong BpHwBinder *proxy = (BpHwBinder*)mIn.readPointer(); 11337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->sendObituary(); 11347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DEAD_BINDER_DONE); 11354ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 11367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1137dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: 11397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11401e118d2b86540f7a7d840ec1510337da49f1446cYifan Hong BpHwBinder *proxy = (BpHwBinder*)mIn.readPointer(); 11417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->getWeakRefs()->decWeak(proxy); 11427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1143dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FINISHED: 11457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = TIMED_OUT; 11467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1147dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_NOOP: 11497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1150dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_SPAWN_LOOPER: 11527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->spawnPooledThread(false); 11537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 1154dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 11567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("*** BAD COMMAND %d received from Binder driver\n", cmd); 11577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = UNKNOWN_ERROR; 11587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) { 11627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = result; 11637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1164dde40f31347a51aa7249cb192f97276c30d984f5Yifan Hong 11657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 11667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 11677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::threadDestructor(void *st) 11697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 11700646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IPCThreadState* const self = static_cast<IPCThreadState*>(st); 11710646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (self) { 11720646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor self->flushCommands(); 1173e5e7055dcbfcabfdd735318a0d712e07544a523aElliott Hughes#if defined(__ANDROID__) 1174597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (self->mProcess->mDriverFD > 0) { 1175597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0); 1176597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 11777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 11780646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor delete self; 11790646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 11807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 11817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1183f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, 1184f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*dataSize*/, 1185f04879896beb41f2455017ace482283bc2ef321cColin Cross const binder_size_t* /*objects*/, 1186f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*objectsSize*/, void* /*cookie*/) 11877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 118893cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("Freeing parcel %p", &parcel); 11897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 11907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Writing BC_FREE_BUFFER for " << data << endl; 11917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1192d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(data != NULL, "Called with NULL data"); 11937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (parcel != NULL) parcel->closeFileDescriptors(); 11947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* state = self(); 11957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian state->mOut.writeInt32(BC_FREE_BUFFER); 11964ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu state->mOut.writePointer((uintptr_t)data); 11977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 11987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1199f75a23d54cc9e5f7b6b976e65b6ec346178f306dMartijn Coenen}; // namespace hardware 12007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; // namespace android 1201