IPCThreadState.cpp revision 4bdf7e9b35d72a8c62c2b271c398f7e572d55a1c
17922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian/* 27922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Copyright (C) 2005 The Android Open Source Project 37922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * 47922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Licensed under the Apache License, Version 2.0 (the "License"); 57922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * you may not use this file except in compliance with the License. 67922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * You may obtain a copy of the License at 77922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * 87922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * http://www.apache.org/licenses/LICENSE-2.0 97922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * 107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * Unless required by applicable law or agreed to in writing, software 117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * distributed under the License is distributed on an "AS IS" BASIS, 127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * See the License for the specific language governing permissions and 147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian * limitations under the License. 157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian */ 167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 172b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks#define LOG_TAG "IPCThreadState" 182b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 19164757037f944dae1eb5f76176570b2e43a37b55Mathias Agopian#include <binder/IPCThreadState.h> 207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 21164757037f944dae1eb5f76176570b2e43a37b55Mathias Agopian#include <binder/Binder.h> 22164757037f944dae1eb5f76176570b2e43a37b55Mathias Agopian#include <binder/BpBinder.h> 234ea13dcd270953215f51345e83708c16963d332fMathias Agopian#include <binder/TextOutput.h> 244ea13dcd270953215f51345e83708c16963d332fMathias Agopian 25cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten#include <cutils/sched_policy.h> 267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Debug.h> 277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/Log.h> 287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <utils/threads.h> 297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <private/binder/binder_module.h> 317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <private/binder/Static.h> 327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sys/ioctl.h> 347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <signal.h> 357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <errno.h> 367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <stdio.h> 377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <unistd.h> 387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#ifdef HAVE_PTHREADS 407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <pthread.h> 417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sched.h> 427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <sys/resource.h> 437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#ifdef HAVE_WIN32_THREADS 457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#include <windows.h> 467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_NDEBUG 507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_TRANSACTIONS() if (false) 527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_COMMANDS() if (false) 537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_REMOTEREFS(...) 547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define IF_LOG_REMOTEREFS() if (false) 557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_THREADPOOL(...) 567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#define LOG_ONEWAY(...) 577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 605854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_TRANSACTIONS() IF_ALOG(LOG_VERBOSE, "transact") 615854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_COMMANDS() IF_ALOG(LOG_VERBOSE, "ipc") 625854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_REMOTEREFS(...) ALOG(LOG_DEBUG, "remoterefs", __VA_ARGS__) 635854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define IF_LOG_REMOTEREFS() IF_ALOG(LOG_DEBUG, "remoterefs") 645854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_THREADPOOL(...) ALOG(LOG_DEBUG, "threadpool", __VA_ARGS__) 655854b917f0d7b18a74786f652a981f241cc906f5Steve Block#define LOG_ONEWAY(...) ALOG(LOG_DEBUG, "ipc", __VA_ARGS__) 667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// --------------------------------------------------------------------------- 707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiannamespace android { 727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx); 747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getCommandString(size_t idx); 757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd); 767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd); 777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// This will result in a missing symbol failure if the IF_LOG_COMMANDS() 797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian// conditionals don't get stripped... but that is probably what we want. 807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if !LOG_NDEBUG 817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kReturnStrings[] = { 82457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_ERROR", 837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_OK", 847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_TRANSACTION", 857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_REPLY", 867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE_RESULT", 877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DEAD_REPLY", 887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_TRANSACTION_COMPLETE", 897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_INCREFS", 907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE", 917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE", 927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DECREFS", 937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE", 947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_NOOP", 957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_SPAWN_LOOPER", 967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_FINISHED", 977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_DEAD_BINDER", 98457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_CLEAR_DEATH_NOTIFICATION_DONE", 99457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden "BR_FAILED_REPLY" 1007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; 1017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char *kCommandStrings[] = { 1037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_TRANSACTION", 1047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REPLY", 1057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE_RESULT", 1067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_FREE_BUFFER", 1077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_INCREFS", 1087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE", 1097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_RELEASE", 1107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_DECREFS", 1117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_INCREFS_DONE", 1127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ACQUIRE_DONE", 1137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ATTEMPT_ACQUIRE", 1147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REGISTER_LOOPER", 1157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_ENTER_LOOPER", 1167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_EXIT_LOOPER", 1177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_REQUEST_DEATH_NOTIFICATION", 1187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_CLEAR_DEATH_NOTIFICATION", 1197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BC_DEAD_BINDER_DONE" 1207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; 1217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getReturnString(size_t idx) 1237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (idx < sizeof(kReturnStrings) / sizeof(kReturnStrings[0])) 1257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return kReturnStrings[idx]; 1267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 1277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return "unknown"; 1287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const char* getCommandString(size_t idx) 1317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (idx < sizeof(kCommandStrings) / sizeof(kCommandStrings[0])) 1337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return kCommandStrings[idx]; 1347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 1357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return "unknown"; 1367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printBinderTransactionData(TextOutput& out, const void* data) 1397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 1407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const binder_transaction_data* btd = 1417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (const binder_transaction_data*)data; 142457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (btd->target.handle < 1024) { 143457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden /* want to print descriptors in decimal; guess based on value */ 144457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << "target.desc=" << btd->target.handle; 145457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } else { 146457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << "target.ptr=" << btd->target.ptr; 147457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } 148457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << " (cookie " << btd->cookie << ")" << endl 1497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "code=" << TypeCode(btd->code) << ", flags=" << (void*)btd->flags << endl 1507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "data=" << btd->data.ptr.buffer << " (" << (void*)btd->data_size 1517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " bytes)" << endl 1527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "offsets=" << btd->data.ptr.offsets << " (" << (void*)btd->offsets_size 153457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden << " bytes)"; 1547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return btd+1; 1557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 1567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printReturnCommand(TextOutput& out, const void* _cmd) 1587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 159457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden static const size_t N = sizeof(kReturnStrings)/sizeof(kReturnStrings[0]); 1607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t* cmd = (const int32_t*)_cmd; 1617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t code = *cmd++; 162457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden size_t cmdIndex = code & 0xff; 163457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (code == (int32_t) BR_ERROR) { 1647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "BR_ERROR: " << (void*)(*cmd++) << endl; 1657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 166457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden } else if (cmdIndex >= N) { 1677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "Unknown reply: " << code << endl; 1687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 1697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 170457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << kReturnStrings[cmdIndex]; 1717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (code) { 1737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 1747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: { 1757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << indent; 1767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = (const int32_t *)printBinderTransactionData(out, cmd); 1777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << dedent; 1787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: { 1817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t res = *cmd++; 1827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)"); 1837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 1867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 1877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 1887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: { 1897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 1907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 1917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": target=" << (void*)b << " (cookie " << (void*)c << ")"; 1927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 1937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: { 1957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t p = *cmd++; 1967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 1977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 1987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": target=" << (void*)b << " (cookie " << (void*)c 1997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "), pri=" << p; 2007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 2037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: { 2047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 2057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": death cookie " << (void*)c; 2067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 207457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 208457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden default: 209457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // no details to show for: BR_OK, BR_DEAD_REPLY, 210457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // BR_TRANSACTION_COMPLETE, BR_FINISHED 211457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden break; 2127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 2137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << endl; 2157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 2177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic const void* printCommand(TextOutput& out, const void* _cmd) 2197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 220457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden static const size_t N = sizeof(kCommandStrings)/sizeof(kCommandStrings[0]); 2217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t* cmd = (const int32_t*)_cmd; 2227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t code = *cmd++; 223457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden size_t cmdIndex = code & 0xff; 224457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 225457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden if (cmdIndex >= N) { 2267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << "Unknown command: " << code << endl; 2277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 229457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << kCommandStrings[cmdIndex]; 230457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 2317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (code) { 2327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_TRANSACTION: 2337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_REPLY: { 2347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << indent; 2357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = (const int32_t *)printBinderTransactionData(out, cmd); 2367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << dedent; 2377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE_RESULT: { 2407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t res = *cmd++; 2417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": " << res << (res ? " (SUCCESS)" : " (FAILURE)"); 2427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_FREE_BUFFER: { 2457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t buf = *cmd++; 2467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": buffer=" << (void*)buf; 2477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_INCREFS: 2507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE: 2517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_RELEASE: 2527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_DECREFS: { 2537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t d = *cmd++; 254457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << ": desc=" << d; 2557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_INCREFS_DONE: 2587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ACQUIRE_DONE: { 2597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t b = *cmd++; 2607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 2617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": target=" << (void*)b << " (cookie " << (void*)c << ")"; 2627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_ATTEMPT_ACQUIRE: { 2657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t p = *cmd++; 2667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t d = *cmd++; 267457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden out << ": desc=" << d << ", pri=" << p; 2687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_REQUEST_DEATH_NOTIFICATION: 2717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_CLEAR_DEATH_NOTIFICATION: { 2727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t h = *cmd++; 2737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 2747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": handle=" << h << " (death cookie " << (void*)c << ")"; 2757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 2767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BC_DEAD_BINDER_DONE: { 2787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t c = *cmd++; 2797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << ": death cookie " << (void*)c; 2807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 281457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 282457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden default: 283457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // no details to show for: BC_REGISTER_LOOPER, BC_ENTER_LOOPER, 284457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden // BC_EXIT_LOOPER 285457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden break; 2867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 2877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian out << endl; 2897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return cmd; 2907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 2917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 2927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_mutex_t gTLSMutex = PTHREAD_MUTEX_INITIALIZER; 2947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gHaveTLS = false; 2957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic pthread_key_t gTLS = 0; 2967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatic bool gShutdown = false; 2975f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornstatic bool gDisableBackgroundScheduling = false; 2987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 2997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState* IPCThreadState::self() 3007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gHaveTLS) { 3027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianrestart: 3037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pthread_key_t k = gTLS; 3047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 3057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (st) return st; 3067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return new IPCThreadState; 3077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gShutdown) return NULL; 3107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_lock(&gTLSMutex); 3127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!gHaveTLS) { 3137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (pthread_key_create(&gTLS, threadDestructor) != 0) { 3147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_unlock(&gTLSMutex); 3157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NULL; 3167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gHaveTLS = true; 3187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_mutex_unlock(&gTLSMutex); 3207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto restart; 3217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3237794994fc8947b65730108aa4700b109c268bb6dBrad FitzpatrickIPCThreadState* IPCThreadState::selfOrNull() 3247794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick{ 3257794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick if (gHaveTLS) { 3267794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick const pthread_key_t k = gTLS; 3277794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k); 3287794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick return st; 3297794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick } 3307794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick return NULL; 3317794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick} 3327794994fc8947b65730108aa4700b109c268bb6dBrad Fitzpatrick 3337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::shutdown() 3347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gShutdown = true; 3367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (gHaveTLS) { 3387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // XXX Need to wait for all thread pool threads to exit! 3397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* st = (IPCThreadState*)pthread_getspecific(gTLS); 3407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (st) { 3417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian delete st; 3427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, NULL); 3437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian gHaveTLS = false; 3457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 3467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3485f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackbornvoid IPCThreadState::disableBackgroundScheduling(bool disable) 3495f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn{ 3505f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn gDisableBackgroundScheduling = disable; 3515f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn} 3525f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn 3537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiansp<ProcessState> IPCThreadState::process() 3547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mProcess; 3567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearLastError() 3597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = mLastError; 3617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = NO_ERROR; 3627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 3637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 365b699a79a34045bf15394edaca665d06ccecf4567Jeff Brownint IPCThreadState::getCallingPid() const 3667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mCallingPid; 3687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 370b699a79a34045bf15394edaca665d06ccecf4567Jeff Brownint IPCThreadState::getCallingUid() const 3717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return mCallingUid; 3737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 3757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianint64_t IPCThreadState::clearCallingIdentity() 3767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 3777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int64_t token = ((int64_t)mCallingUid<<32) | mCallingPid; 3787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian clearCaller(); 3797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return token; 3807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 3817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 38294c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrickvoid IPCThreadState::setStrictModePolicy(int32_t policy) 38394c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick{ 38494c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick mStrictModePolicy = policy; 38594c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick} 38694c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick 3873f4ef59401d7c2115c273ab1e76c221da22cf8d0Brad Fitzpatrickint32_t IPCThreadState::getStrictModePolicy() const 3883f4ef59401d7c2115c273ab1e76c221da22cf8d0Brad Fitzpatrick{ 38994c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick return mStrictModePolicy; 39094c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick} 39194c3634ac573531efe9a5abbc122a35c201567adBrad Fitzpatrick 39224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrickvoid IPCThreadState::setLastTransactionBinderFlags(int32_t flags) 39324f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick{ 39424f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mLastTransactionBinderFlags = flags; 39524f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick} 39624f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 39724f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrickint32_t IPCThreadState::getLastTransactionBinderFlags() const 39824f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick{ 39924f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick return mLastTransactionBinderFlags; 40024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick} 40124f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 4027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::restoreCallingIdentity(int64_t token) 4037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 4047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = (int)(token>>32); 4057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = (int)token; 4067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::clearCaller() 4097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 410b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen mCallingPid = getpid(); 411b4f35d0238103bd22c1a2cf1b6a31f2fba21fc3eMarco Nelissen mCallingUid = getuid(); 4127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::flushCommands() 4157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 4167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mProcess->mDriverFD <= 0) 4177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return; 4187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 4197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 4207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4210646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::getAndExecuteCommand() 4220646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4230646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 4240646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor int32_t cmd; 4250646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4260646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = talkWithDriver(); 4270646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result >= NO_ERROR) { 4280646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor size_t IN = mIn.dataAvail(); 4290646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (IN < sizeof(int32_t)) return result; 4300646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor cmd = mIn.readInt32(); 4310646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IF_LOG_COMMANDS() { 4320646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor alog << "Processing top-level Command: " 4330646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << getReturnString(cmd) << endl; 4340646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4350646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4360646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = executeCommand(cmd); 4370646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4380646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // After executing the command, ensure that the thread is returned to the 4390646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // foreground cgroup before rejoining the pool. The driver takes care of 4400646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // restoring the priority, but doesn't do anything with cgroups so we 4410646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // need to take care of that here in userspace. Note that we do make 4420646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // sure to go in the foreground after executing a transaction, but 4430646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // there are other callbacks into user code that could have changed 4440646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor // our group so we want to make absolutely sure it is put back. 4450646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor set_sched_policy(mMyThreadId, SP_FOREGROUND); 4460646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4470646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4480646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 4490646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 4500646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4510646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor// When we've cleared the incoming command queue, process any pending derefs 4520646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorvoid IPCThreadState::processPendingDerefs() 4530646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 4540646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mIn.dataPosition() >= mIn.dataSize()) { 4550646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor size_t numPending = mPendingWeakDerefs.size(); 4560646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (numPending > 0) { 4570646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor for (size_t i = 0; i < numPending; i++) { 4580646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor RefBase::weakref_type* refs = mPendingWeakDerefs[i]; 4590646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor refs->decWeak(mProcess.get()); 4600646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4610646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mPendingWeakDerefs.clear(); 4620646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4630646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4640646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor numPending = mPendingStrongDerefs.size(); 4650646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (numPending > 0) { 4660646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor for (size_t i = 0; i < numPending; i++) { 4670646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor BBinder* obj = mPendingStrongDerefs[i]; 4680646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor obj->decStrong(mProcess.get()); 4690646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4700646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mPendingStrongDerefs.clear(); 4710646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4720646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 4730646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 4740646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 4757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::joinThreadPool(bool isMain) 4767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 4777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_THREADPOOL("**** THREAD %p (PID %d) IS JOINING THE THREAD POOL\n", (void*)pthread_self(), getpid()); 4787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(isMain ? BC_ENTER_LOOPER : BC_REGISTER_LOOPER); 4807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4815f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn // This thread may have been spawned by a thread that was in the background 482cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten // scheduling group, so first we will make sure it is in the foreground 4835f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn // one to avoid performing an initial transaction in the background. 484cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten set_sched_policy(mMyThreadId, SP_FOREGROUND); 4855f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn 4867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result; 4877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 4880646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 4897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // now get the next command to be processed, waiting if necessary 4900646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 4912b17f147508401f8e8cdf59f7a329cb677bd7eadJason Parks 4920646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (result < NO_ERROR && result != TIMED_OUT && result != -ECONNREFUSED && result != -EBADF) { 4930646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor ALOGE("getAndExecuteCommand(fd=%d) returned unexpected error %d, aborting", 494ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker mProcess->mDriverFD, result); 495ee711ec34a64cf71e5f3e9c1494a988fd9002936Jeff Tinker abort(); 4967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 4977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 4987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Let this thread exit the thread pool if it is no longer 4997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // needed and it is not the main process thread. 5007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if(result == TIMED_OUT && !isMain) { 5017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 5027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (result != -ECONNREFUSED && result != -EBADF); 5047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_THREADPOOL("**** THREAD %p (PID %d) IS LEAVING THE THREAD POOL err=%p\n", 5067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (void*)pthread_self(), getpid(), (void*)result); 5077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_EXIT_LOOPER); 5097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian talkWithDriver(false); 5107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5120646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorint IPCThreadState::setupPolling(int* fd) 5130646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5140646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (mProcess->mDriverFD <= 0) { 5150646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return -EBADF; 5160646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 5170646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5180646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor mOut.writeInt32(BC_ENTER_LOOPER); 5190646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor *fd = mProcess->mDriverFD; 5200646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return 0; 5210646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5220646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5230646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynorstatus_t IPCThreadState::handlePolledCommands() 5240646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor{ 5250646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor status_t result; 5260646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5270646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor do { 5280646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor result = getAndExecuteCommand(); 5290646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } while (mIn.dataPosition() < mIn.dataSize()); 5300646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 5310646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor processPendingDerefs(); 5320646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor flushCommands(); 5330646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor return result; 5340646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor} 5350646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor 536f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::stopProcess(bool /*immediate*/) 5377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 53893cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("**** STOPPING PROCESS"); 5397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flushCommands(); 5407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int fd = mProcess->mDriverFD; 5417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->mDriverFD = -1; 5427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian close(fd); 5437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian //kill(getpid(), SIGKILL); 5447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 5457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::transact(int32_t handle, 5477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian uint32_t code, const Parcel& data, 5487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel* reply, uint32_t flags) 5497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 5507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err = data.errorCheck(); 5517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian flags |= TF_ACCEPT_FDS; 5537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 5557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian TextOutput::Bundle _b(alog); 5567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_TRANSACTION thr " << (void*)pthread_self() << " / hand " 5577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << " / code " << TypeCode(code) << ": " 5587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << indent << data << dedent << endl; 5597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 5627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_ONEWAY(">>>> SEND from pid %d uid %d %s", getpid(), getuid(), 5637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian (flags & TF_ONE_WAY) == 0 ? "READ REPLY" : "ONE WAY"); 5647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = writeTransactionData(BC_TRANSACTION, flags, handle, code, data, NULL); 5657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 5687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 5697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 5707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((flags & TF_ONE_WAY) == 0) { 5739887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 5749887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 57593cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction 4"); 5769887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 57793cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI(">>>>>> CALLING transaction %d", code); 5789887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 5799887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 5807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 5817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(reply); 5827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 5837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel fakeReply; 5847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(&fakeReply); 5857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 5869887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #if 0 5879887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn if (code == 4) { // relayout 58893cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction 4"); 5899887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } else { 59093cf854f5e563ba575691b4b639365fe6c517193Steve Block ALOGI("<<<<<< RETURNING transaction %d", code); 5919887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn } 5929887826b424612da22b61bc2b73adc88a4af9c7cDianne Hackborn #endif 5937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 5947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 5957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian TextOutput::Bundle _b(alog); 5967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_REPLY thr " << (void*)pthread_self() << " / hand " 5977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << handle << ": "; 5987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) alog << indent << *reply << dedent << endl; 5997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else alog << "(none requested)" << endl; 6007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 6027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = waitForResponse(NULL, NULL); 6037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 6047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 6067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incStrongHandle(int32_t handle) 6097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incStrongHandle(%d)\n", handle); 6117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE); 6127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decStrongHandle(int32_t handle) 6167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decStrongHandle(%d)\n", handle); 6187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_RELEASE); 6197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::incWeakHandle(int32_t handle) 6237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::incWeakHandle(%d)\n", handle); 6257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS); 6267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::decWeakHandle(int32_t handle) 6307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("IPCThreadState::decWeakHandle(%d)\n", handle); 6327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DECREFS); 6337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::attemptIncStrongHandle(int32_t handle) 6377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 638304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#if HAS_BC_ATTEMPT_ACQUIRE 639457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden LOG_REMOTEREFS("IPCThreadState::attemptIncStrongHandle(%d)\n", handle); 6407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ATTEMPT_ACQUIRE); 6417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(0); // xxx was thread priority 6427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(handle); 6437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = UNKNOWN_ERROR; 6447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian waitForResponse(NULL, &result); 6467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::attemptIncStrongHandle(%ld) = %s\n", 6497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian handle, result == NO_ERROR ? "SUCCESS" : "FAILURE"); 6507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 6517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 653304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#else 654304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg (void)handle; 655304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg ALOGE("%s(%d): Not supported\n", __func__, handle); 656304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg return INVALID_OPERATION; 657304dcaedb7aabc7d070329e641fc4a6a3bac2918Arve Hjønnevåg#endif 6587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::expungeHandle(int32_t handle, IBinder* binder) 6617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if LOG_REFCOUNTS 6637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("IPCThreadState::expungeHandle(%ld)\n", handle); 6647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 6657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian self()->mProcess->expungeHandle(handle, binder); 6667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::requestDeathNotification(int32_t handle, BpBinder* proxy) 6697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_REQUEST_DEATH_NOTIFICATION); 6717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 6724ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 6737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 6747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::clearDeathNotification(int32_t handle, BpBinder* proxy) 6777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_CLEAR_DEATH_NOTIFICATION); 6797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)handle); 6804ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 6817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 6827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::IPCThreadState() 68524f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick : mProcess(ProcessState::self()), 68624f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mMyThreadId(androidGetTid()), 68724f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mStrictModePolicy(0), 68824f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick mLastTransactionBinderFlags(0) 6897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian pthread_setspecific(gTLS, this); 6915f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn clearCaller(); 6927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataCapacity(256); 6937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataCapacity(256); 6947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 6967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias AgopianIPCThreadState::~IPCThreadState() 6977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 6987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 6997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::sendReply(const Parcel& reply, uint32_t flags) 7017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 7037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t statusBuffer; 7047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = writeTransactionData(BC_REPLY, flags, -1, 0, reply, &statusBuffer); 7057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) return err; 7067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return waitForResponse(NULL, NULL); 7087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 7097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::waitForResponse(Parcel *reply, status_t *acquireResult) 7117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 7127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t cmd; 7137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t err; 7147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (1) { 7167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((err=talkWithDriver()) < NO_ERROR) break; 7177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.errorCheck(); 7187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err < NO_ERROR) break; 7197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (mIn.dataAvail() == 0) continue; 7207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian cmd = mIn.readInt32(); 7227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 7247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Processing waitForResponse Command: " 7257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << getReturnString(cmd) << endl; 7267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (cmd) { 7297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION_COMPLETE: 7307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!reply && !acquireResult) goto finish; 7317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 7327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_REPLY: 7347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = DEAD_OBJECT; 7357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FAILED_REPLY: 7387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = FAILED_TRANSACTION; 7397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE_RESULT: 7427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 743d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(acquireResult != NULL, "Unexpected brACQUIRE_RESULT"); 7447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const int32_t result = mIn.readInt32(); 7457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (!acquireResult) continue; 7467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *acquireResult = result ? NO_ERROR : INVALID_OPERATION; 7477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_REPLY: 7517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 7527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 7537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = mIn.read(&tr, sizeof(tr)); 754d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(err == NO_ERROR, "Not enough command data for brREPLY"); 7557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 7567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) { 7587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_STATUS_CODE) == 0) { 7597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reply->ipcSetDataReference( 7607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 762a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 763a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), 7647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer, this); 7657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 766a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg err = *reinterpret_cast<const status_t*>(tr.data.ptr.buffer); 7677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 770a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 771a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 7727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 7747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian freeBuffer(NULL, 7757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 7767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 777a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 778a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), this); 7797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian continue; 7807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian goto finish; 7837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 7857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = executeCommand(cmd); 7867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) goto finish; 7877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 7887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianfinish: 7927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err != NO_ERROR) { 7937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (acquireResult) *acquireResult = err; 7947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (reply) reply->setError(err); 7957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = err; 7967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 7977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 7987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 7997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 8007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::talkWithDriver(bool doReceive) 8027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 803597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 804597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson return -EBADF; 805597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 8067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_write_read bwr; 8087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Is the read buffer empty? 8107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool needRead = mIn.dataPosition() >= mIn.dataSize(); 8117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // We don't want to write anything if we are still reading 8137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // from data left in the input buffer and the caller 8147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // has requested to read the next data. 8157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const size_t outAvail = (!doReceive || needRead) ? mOut.dataSize() : 0; 8167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_size = outAvail; 818a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.write_buffer = (uintptr_t)mOut.data(); 8197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // This is what we'll read. 8217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (doReceive && needRead) { 8227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = mIn.dataCapacity(); 823a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg bwr.read_buffer = (uintptr_t)mIn.data(); 8247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 8257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_size = 0; 826455a70a568f5fa2351d31a64e390246b2e4c4d3eBen Cheng bwr.read_buffer = 0; 8277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 828457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian TextOutput::Bundle _b(alog); 8317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (outAvail != 0) { 8327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Sending commands to driver: " << indent; 8337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = (const void*)bwr.write_buffer; 8347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = ((const uint8_t*)cmds)+bwr.write_size; 8357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, bwr.write_size) << endl; 8367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printCommand(alog, cmds); 8377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 8387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Size of receive buffer: " << bwr.read_size 8407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", needRead: " << needRead << ", doReceive: " << doReceive << endl; 8417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // Return immediately if there is nothing to do. 8447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((bwr.write_size == 0) && (bwr.read_size == 0)) return NO_ERROR; 845457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.write_consumed = 0; 8477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian bwr.read_consumed = 0; 8487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t err; 8497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian do { 8507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "About to read/write, write size = " << mOut.dataSize() << endl; 8527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if defined(HAVE_ANDROID_OS) 8547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (ioctl(mProcess->mDriverFD, BINDER_WRITE_READ, &bwr) >= 0) 8557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = NO_ERROR; 8567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 8577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = -errno; 8587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#else 8597922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian err = INVALID_OPERATION; 8607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 861597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (mProcess->mDriverFD <= 0) { 862597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson err = -EBADF; 863597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 8647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Finished read/write, write size = " << mOut.dataSize() << endl; 8667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } while (err == -EINTR); 868457d51fd623e7572aa0279ef63d8e00a2ace1841Andy McFadden 8697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 870f04879896beb41f2455017ace482283bc2ef321cColin Cross alog << "Our err: " << (void*)(intptr_t)err << ", write consumed: " 8717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << bwr.write_consumed << " (of " << mOut.dataSize() 8720646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor << "), read consumed: " << bwr.read_consumed << endl; 8737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err >= NO_ERROR) { 8767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.write_consumed > 0) { 877a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg if (bwr.write_consumed < mOut.dataSize()) 8787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.remove(0, bwr.write_consumed); 8797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian else 8807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.setDataSize(0); 8817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (bwr.read_consumed > 0) { 8837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataSize(bwr.read_consumed); 8847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mIn.setDataPosition(0); 8857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 8877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian TextOutput::Bundle _b(alog); 8887922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Remaining data size: " << mOut.dataSize() << endl; 8897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Received commands from driver: " << indent; 8907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* cmds = mIn.data(); 8917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const void* end = mIn.data() + mIn.dataSize(); 8927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << HexDump(cmds, mIn.dataSize()) << endl; 8937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian while (cmds < end) cmds = printReturnCommand(alog, cmds); 8947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << dedent; 8957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 8977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 8987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 8997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return err; 9007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::writeTransactionData(int32_t cmd, uint32_t binderFlags, 9037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian int32_t handle, uint32_t code, const Parcel& data, status_t* statusBuffer) 9047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 9057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 9067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.target.handle = handle; 9087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.code = code; 9097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.flags = binderFlags; 91068c8a657d43a7346746794194093d3912583a34bEvgeniy Stepanov tr.cookie = 0; 91168c8a657d43a7346746794194093d3912583a34bEvgeniy Stepanov tr.sender_pid = 0; 91268c8a657d43a7346746794194093d3912583a34bEvgeniy Stepanov tr.sender_euid = 0; 9137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const status_t err = data.errorCheck(); 9157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (err == NO_ERROR) { 9167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size = data.ipcDataSize(); 9177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data.ptr.buffer = data.ipcData(); 918a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size = data.ipcObjectsCount()*sizeof(binder_size_t); 9197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data.ptr.offsets = data.ipcObjects(); 9207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else if (statusBuffer) { 9217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.flags |= TF_STATUS_CODE; 9227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian *statusBuffer = err; 9237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size = sizeof(status_t); 9244bdf7e9b35d72a8c62c2b271c398f7e572d55a1cArve Hjønnevåg tr.data.ptr.buffer = reinterpret_cast<uintptr_t>(statusBuffer); 9257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.offsets_size = 0; 926a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.data.ptr.offsets = 0; 9277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 9287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return (mLastError = err); 9297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(cmd); 9327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.write(&tr, sizeof(tr)); 9337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return NO_ERROR; 9357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopiansp<BBinder> the_context_object; 9387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid setTheContextObject(sp<BBinder> obj) 9407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 9417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian the_context_object = obj; 9427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 9437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianstatus_t IPCThreadState::executeCommand(int32_t cmd) 9457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 9467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian BBinder* obj; 9477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian RefBase::weakref_type* refs; 9487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian status_t result = NO_ERROR; 9497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9507922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian switch (cmd) { 9517922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ERROR: 9527922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.readInt32(); 9537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9547922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9557922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_OK: 9567922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9587922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ACQUIRE: 9594ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 9604ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 961d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ACQUIRE: object %p does not match cookie %p (expected %p)", 9637922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 9647922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->incStrong(mProcess.get()); 9657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 9667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_ACQUIRE from driver on %p", obj); 9677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 9687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_DONE); 9704ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 9714ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 9727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_RELEASE: 9754ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 9764ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 977d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(refs->refBase() == obj, 9787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_RELEASE: object %p does not match cookie %p (expected %p)", 9797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 9807922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_REMOTEREFS() { 9817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_REMOTEREFS("BR_RELEASE from driver on %p", obj); 9827922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian obj->printRefs(); 9837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 9847922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingStrongDerefs.push(obj); 9857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_INCREFS: 9884ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 9894ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 9907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs->incWeak(mProcess.get()); 9917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_INCREFS_DONE); 9924ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)refs); 9934ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)obj); 9947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 9957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 9967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DECREFS: 9974ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 9984ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 9997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // NOTE: This assertion is not valid, because the object may no 10007922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // longer exist (thus the (BBinder*)cast above resulting in a different 10017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // memory address). 1002d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block //ALOG_ASSERT(refs->refBase() == obj, 10037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // "BR_DECREFS: object %p does not match cookie %p (expected %p)", 10047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // refs, obj, refs->refBase()); 10057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mPendingWeakDerefs.push(refs); 10067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 10077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_ATTEMPT_ACQUIRE: 10094ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu refs = (RefBase::weakref_type*)mIn.readPointer(); 10104ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu obj = (BBinder*)mIn.readPointer(); 10117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10127922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const bool success = refs->attemptIncStrong(mProcess.get()); 1014d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(success && refs->refBase() == obj, 10157922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "BR_ATTEMPT_ACQUIRE: object %p does not match cookie %p (expected %p)", 10167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian refs, obj, refs->refBase()); 10177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_ACQUIRE_RESULT); 10197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32((int32_t)success); 10207922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 10227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_TRANSACTION: 10247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 10257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian binder_transaction_data tr; 10267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = mIn.read(&tr, sizeof(tr)); 1027d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(result == NO_ERROR, 10287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian "Not enough command data for brTRANSACTION"); 10297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) break; 10307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel buffer; 10327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian buffer.ipcSetDataReference( 10337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer), 10347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian tr.data_size, 1035a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg reinterpret_cast<const binder_size_t*>(tr.data.ptr.offsets), 1036a544070681ccced272b4fa3b5781096cba05dde5Arve Hjønnevåg tr.offsets_size/sizeof(binder_size_t), freeBuffer, this); 10377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const pid_t origPid = mCallingPid; 10397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian const uid_t origUid = mCallingUid; 10407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = tr.sender_pid; 10427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = tr.sender_euid; 10437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10447c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate int curPrio = getpriority(PRIO_PROCESS, mMyThreadId); 10457c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate if (gDisableBackgroundScheduling) { 10467c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate if (curPrio > ANDROID_PRIORITY_NORMAL) { 10477c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // We have inherited a reduced priority from the caller, but do not 10487c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // want to run in that state in this process. The driver set our 10497c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // priority already (though not our scheduling class), so bounce 10507c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // it back to the default before invoking the transaction. 10517c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate setpriority(PRIO_PROCESS, mMyThreadId, ANDROID_PRIORITY_NORMAL); 10527c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate } 10537c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate } else { 10547c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate if (curPrio >= ANDROID_PRIORITY_BACKGROUND) { 10557c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // We want to use the inherited priority from the caller. 10567c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // Ensure this thread is in the background scheduling class, 10577c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // since the driver won't modify scheduling classes for us. 10587c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // The scheduling group is reset to default by the caller 10597c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate // once this method returns after the transaction is complete. 1060cb5e24201c07fc7d9cff87c60251b54a4f2a21c9Glenn Kasten set_sched_policy(mMyThreadId, SP_BACKGROUND); 10617c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate } 10625f4d7e81777db67004bdd7836a133607c37ae936Dianne Hackborn } 10637c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate 106493cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI(">>>> TRANSACT from pid %d uid %d\n", mCallingPid, mCallingUid); 10657922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10667922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian Parcel reply; 10677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 10687922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian TextOutput::Bundle _b(alog); 10697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BR_TRANSACTION thr " << (void*)pthread_self() 10707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << " / obj " << tr.target.ptr << " / code " 10717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << TypeCode(tr.code) << ": " << indent << buffer 10727922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << dedent << endl 10737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << "Data addr = " 10747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const uint8_t*>(tr.data.ptr.buffer) 10757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << ", offsets addr=" 10767922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << reinterpret_cast<const size_t*>(tr.data.ptr.offsets) << endl; 10777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (tr.target.ptr) { 10797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian sp<BBinder> b((BBinder*)tr.cookie); 108024f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick const status_t error = b->transact(tr.code, buffer, &reply, tr.flags); 10817922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (error < NO_ERROR) reply.setError(error); 108224f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick 10837922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 108424f8bca9cb9778ae67a3642108d4ab67eca642f8Brad Fitzpatrick const status_t error = the_context_object->transact(tr.code, buffer, &reply, tr.flags); 10857922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (error < NO_ERROR) reply.setError(error); 10867922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10877922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 108893cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("<<<< TRANSACT from pid %d restore pid %d uid %d\n", 10897922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian // mCallingPid, origPid, origUid); 10907922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10917922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if ((tr.flags & TF_ONE_WAY) == 0) { 10927922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_ONEWAY("Sending reply to %d!", mCallingPid); 10937922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian sendReply(reply, 0); 10947922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } else { 10957922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian LOG_ONEWAY("NOT sending reply to %d!", mCallingPid); 10967922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 10977922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 10987922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingPid = origPid; 10997922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mCallingUid = origUid; 11007c4dfece81abcf7d67b747ce25d452b150f9e9cbChristopher Tate 11017922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_TRANSACTIONS() { 11027922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian TextOutput::Bundle _b(alog); 11037922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "BC_REPLY thr " << (void*)pthread_self() << " / obj " 11047922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian << tr.target.ptr << ": " << indent << reply << dedent << endl; 11057922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11067922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11077922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11087922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11097922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11107922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_DEAD_BINDER: 11117922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11124ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu BpBinder *proxy = (BpBinder*)mIn.readPointer(); 11137922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->sendObituary(); 11147922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mOut.writeInt32(BC_DEAD_BINDER_DONE); 11154ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu mOut.writePointer((uintptr_t)proxy); 11167922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 11177922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11187922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_CLEAR_DEATH_NOTIFICATION_DONE: 11197922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian { 11204ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu BpBinder *proxy = (BpBinder*)mIn.readPointer(); 11217922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian proxy->getWeakRefs()->decWeak(proxy); 11227922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } break; 11237922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11247922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_FINISHED: 11257922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = TIMED_OUT; 11267922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11277922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11287922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_NOOP: 11297922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11307922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11317922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian case BR_SPAWN_LOOPER: 11327922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mProcess->spawnPooledThread(false); 11337922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11347922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11357922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian default: 11367922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian printf("*** BAD COMMAND %d received from Binder driver\n", cmd); 11377922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian result = UNKNOWN_ERROR; 11387922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian break; 11397922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11407922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11417922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (result != NO_ERROR) { 11427922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian mLastError = result; 11437922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 11447922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11457922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian return result; 11467922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 11477922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11487922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopianvoid IPCThreadState::threadDestructor(void *st) 11497922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 11500646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor IPCThreadState* const self = static_cast<IPCThreadState*>(st); 11510646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor if (self) { 11520646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor self->flushCommands(); 11537922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#if defined(HAVE_ANDROID_OS) 1154597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson if (self->mProcess->mDriverFD > 0) { 1155597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson ioctl(self->mProcess->mDriverFD, BINDER_THREAD_EXIT, 0); 1156597a3c7696af00cc4c3e6d919c507adc552cdfd7Johannes Carlsson } 11577922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian#endif 11580646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor delete self; 11590646cb013e216d9f1fcd76365d07f369af8b989dTodd Poynor } 11607922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 11617922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11627922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 1163f04879896beb41f2455017ace482283bc2ef321cColin Crossvoid IPCThreadState::freeBuffer(Parcel* parcel, const uint8_t* data, 1164f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*dataSize*/, 1165f04879896beb41f2455017ace482283bc2ef321cColin Cross const binder_size_t* /*objects*/, 1166f04879896beb41f2455017ace482283bc2ef321cColin Cross size_t /*objectsSize*/, void* /*cookie*/) 11677922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian{ 116893cf854f5e563ba575691b4b639365fe6c517193Steve Block //ALOGI("Freeing parcel %p", &parcel); 11697922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IF_LOG_COMMANDS() { 11707922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian alog << "Writing BC_FREE_BUFFER for " << data << endl; 11717922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian } 1172d0bfabc8c2b42ca8f71f066b8a6de2e8f7995203Steve Block ALOG_ASSERT(data != NULL, "Called with NULL data"); 11737922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian if (parcel != NULL) parcel->closeFileDescriptors(); 11747922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian IPCThreadState* state = self(); 11757922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian state->mOut.writeInt32(BC_FREE_BUFFER); 11764ca5bafb8da8e2316464be178f32a170b494300bSerban Constantinescu state->mOut.writePointer((uintptr_t)data); 11777922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian} 11787922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian 11797922fa29f3a18386b6eb4cb19e8c582d9f751345Mathias Agopian}; // namespace android 1180