19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Copyright (C) 2006 The Android Open Source Project 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * you may not use this file except in compliance with the License. 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * You may obtain a copy of the License at 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#define LOG_TAG "JavaBinder" 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project//#define LOG_NDEBUG 0 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 20d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey#include "android_os_Parcel.h" 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "android_util_Binder.h" 22d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include "JNIHelp.h" 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <fcntl.h> 26cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn#include <inttypes.h> 27ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick#include <stdio.h> 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <sys/stat.h> 292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <sys/types.h> 308f26b323d8f78c6a183e74c464864ef7da457267Brad Fitzpatrick#include <unistd.h> 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Atomic.h> 330795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IInterface.h> 340795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IPCThreadState.h> 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project#include <utils/Log.h> 362c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#include <utils/SystemClock.h> 370b41448506610f73302cc631677823fd8b865ea5Christopher Tate#include <utils/List.h> 380b41448506610f73302cc631677823fd8b865ea5Christopher Tate#include <utils/KeyedVector.h> 3944bc18664985e845a2299f20b6392d378fad8b4dColin Cross#include <log/logger.h> 400795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/Parcel.h> 410795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/ProcessState.h> 420795272aa226f4e965968a03daddc53ce30b7cdaMathias Agopian#include <binder/IServiceManager.h> 435348c014129b766d621ef82a6e42007009ffc310Brad Fitzpatrick#include <utils/threads.h> 440bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown#include <utils/String8.h> 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 46ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate#include <ScopedUtfChars.h> 47ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate#include <ScopedLocalRef.h> 48ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate 49987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe#include "core_jni_helpers.h" 50987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 5171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block//#undef ALOGV 5271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block//#define ALOGV(...) fprintf(stderr, __VA_ARGS__) 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#define DEBUG_DEATH 0 5579dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#if DEBUG_DEATH 565baa3a62a97544669fba6d65a11c07f252e654ddSteve Block#define LOGDEATH ALOGD 5779dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#else 5871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block#define LOGDEATH ALOGV 5979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate#endif 6079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectusing namespace android; 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct bindernative_offsets_t 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mExecTransact; 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderOffsets; 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderinternal_offsets_t 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mForceGc; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderInternalOffsets; 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct error_offsets_t 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gErrorOffsets; 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct binderproxy_offsets_t 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mSendDeathNotice; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Object state. 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mObject; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jfieldID mSelf; 105bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate jfieldID mOrgue; 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gBinderProxyOffsets; 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1090d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tatestatic struct class_offsets_t 1100d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate{ 1110d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate jmethodID mGetName; 1120d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate} gClassOffsets; 1130d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct log_offsets_t 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Class state. 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mLogE; 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gLogOffsets; 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic struct parcel_file_descriptor_offsets_t 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jclass mClass; 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jmethodID mConstructor; 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} gParcelFileDescriptorOffsets; 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 129727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic struct strict_mode_callback_offsets_t 130727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 131727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick jclass mClass; 132727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick jmethodID mCallback; 133727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} gStrictModeCallbackOffsets; 134727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumRefsCreated = 0; 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumProxyRefs = 0; 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumLocalRefs = 0; 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic volatile int32_t gNumDeathRefs = 0; 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void incRefsCreated(JNIEnv* env) 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int old = android_atomic_inc(&gNumRefsCreated); 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (old == 200) { 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticVoidMethod(gBinderInternalOffsets.mClass, 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalOffsets.mForceGc); 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 15271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Now have %d binder ops", old); 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JavaVM* jnienv_to_javavm(JNIEnv* env) 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* vm; 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->GetJavaVM(&vm) >= 0 ? vm : NULL; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic JNIEnv* javavm_to_jnienv(JavaVM* vm) 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env; 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return vm->GetEnv((void **)&env, JNI_VERSION_1_4) >= 0 ? env : NULL; 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void report_exception(JNIEnv* env, jthrowable excep, const char* msg) 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jstring tagstr = env->NewStringUTF(LOG_TAG); 173cf6775eece8628ac069a6d4803e7f20a017e7e62Mathieu Chartier jstring msgstr = NULL; 174cf6775eece8628ac069a6d4803e7f20a017e7e62Mathieu Chartier if (tagstr != NULL) { 175cf6775eece8628ac069a6d4803e7f20a017e7e62Mathieu Chartier msgstr = env->NewStringUTF(msg); 176cf6775eece8628ac069a6d4803e7f20a017e7e62Mathieu Chartier } 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if ((tagstr == NULL) || (msgstr == NULL)) { 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); /* assume exception (OOM?) was thrown */ 1803762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Unable to call Log.e()\n"); 1813762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("%s", msg); 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project goto bail; 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->CallStaticIntMethod( 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gLogOffsets.mClass, gLogOffsets.mLogE, tagstr, msgstr, excep); 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->ExceptionCheck()) { 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* attempting to log the failure has failed */ 1898564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Failed trying to log exception, msg='%s'\n", msg); 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->ExceptionClear(); 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(excep, gErrorOffsets.mClass)) { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * It's an Error: Reraise the exception, detach this thread, and 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * wait for the fireworks. Die even more blatantly after a minute 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * if the gentler attempt doesn't do the trick. 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The GetJavaVM function isn't on the "approved" list of JNI calls 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * that can be made while an exception is pending, so we want to 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * get the VM ptr, throw the exception, and then detach the thread. 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->Throw(excep); 204876b7d8fa8c587cccbe11bd30fcdb6c378776420Mathieu Chartier env->ExceptionDescribe(); 2053762c311729fe9f3af085c14c5c1fb471d994c03Steve Block ALOGE("Forcefully exiting"); 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project exit(1); 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectbail: 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* discard local refs created for us by VM */ 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(tagstr); 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteLocalRef(msgstr); 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinder : public BBinder 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinder(JNIEnv* env, jobject object) 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)) 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 22371f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Creating JavaBBinder %p\n", this); 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumLocalRefs); 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool checkSubclass(const void* subclassID) const 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return subclassID == &gBinderOffsets; 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object() const 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mObject; 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaBBinder() 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 24171f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Destroying JavaBBinder %p\n", this); 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumLocalRefs); 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(mObject); 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t onTransact( 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project uint32_t code, const Parcel& data, Parcel* reply, uint32_t flags = 0) 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 25271f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("onTransact() on %p calling object %p in env %p vm %p\n", this, mObject, env, mVM); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 254727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState* thread_state = IPCThreadState::self(); 255ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn const int32_t strict_policy_before = thread_state->getStrictModePolicy(); 256727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from %p to Java code sending: ", this); 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //data.print(); 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("\n"); 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = env->CallBooleanMethod(mObject, gBinderOffsets.mExecTransact, 2618ab665dda40ab10e60fc69392022171f454af530Ashok Bhat code, reinterpret_cast<jlong>(&data), reinterpret_cast<jlong>(reply), flags); 262727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 26398671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier if (env->ExceptionCheck()) { 26498671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier jthrowable excep = env->ExceptionOccurred(); 2659013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert report_exception(env, excep, 2669013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "*** Uncaught remote exception! " 2679013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "(Exceptions are not yet supported across processes.)"); 2689013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert res = JNI_FALSE; 2699013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert 2709013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert /* clean up JNI local ref -- we don't return to Java code */ 2719013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert env->DeleteLocalRef(excep); 2729013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert } 2739013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert 274ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn // Check if the strict mode state changed while processing the 275ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn // call. The Binder state will be restored by the underlying 276ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn // Binder system in IPCThreadState, however we need to take care 277ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn // of the parallel Java state as well. 278ce92b0d070c4967914698b4e257c203d7121c972Dianne Hackborn if (thread_state->getStrictModePolicy() != strict_policy_before) { 279727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick set_dalvik_blockguard_policy(env, strict_policy_before); 280727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick } 281727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 28298671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier if (env->ExceptionCheck()) { 28398671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier jthrowable excep = env->ExceptionOccurred(); 28498671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier report_exception(env, excep, 2859013ccd9fcf3ac317e122aff08cb27cdac2b95feBjorn Bringert "*** Uncaught exception in onBinderStrictModePolicyChange"); 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* clean up JNI local ref -- we don't return to Java code */ 28798671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier env->DeleteLocalRef(excep); 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 290a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn // Need to always call through the native implementation of 291a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn // SYSPROPS_TRANSACTION. 292a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn if (code == SYSPROPS_TRANSACTION) { 293a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn BBinder::onTransact(code, data, reply, flags); 294a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn } 295a53de0629f3b94472c0f160f5bbe1090b020feabDianne Hackborn 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //aout << "onTransact to Java code; result=" << res << endl 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << "Transact from " << this << " to Java code returning " 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // << reply << ": " << *reply << endl; 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res != JNI_FALSE ? NO_ERROR : UNKNOWN_TRANSACTION; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual status_t dump(int fd, const Vector<String16>& args) 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaVM* const mVM; 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject const mObject; 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaBBinderHolder : public RefBase 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 3170b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaBBinder> get(JNIEnv* env, jobject obj) 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> b = mBinder.promote(); 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (b == NULL) { 3220b41448506610f73302cc631677823fd8b865ea5Christopher Tate b = new JavaBBinder(env, obj); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project mBinder = b; 324cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn ALOGV("Creating JavaBinder %p (refs %p) for Object %p, weakCount=%" PRId32 "\n", 3250b41448506610f73302cc631677823fd8b865ea5Christopher Tate b.get(), b->getWeakRefs(), obj, b->getWeakRefs()->getWeakCount()); 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return b; 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<JavaBBinder> getExisting() 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mLock); 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return mBinder.promote(); 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Mutex mLock; 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project wp<JavaBBinder> mBinder; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3440b41448506610f73302cc631677823fd8b865ea5Christopher Tate// Per-IBinder death recipient bookkeeping. This is how we reconcile local jobject 3450b41448506610f73302cc631677823fd8b865ea5Christopher Tate// death recipient references passed in through JNI with the permanent corresponding 3460b41448506610f73302cc631677823fd8b865ea5Christopher Tate// JavaDeathRecipient objects. 3470b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3480b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass JavaDeathRecipient; 3490b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3500b41448506610f73302cc631677823fd8b865ea5Christopher Tateclass DeathRecipientList : public RefBase { 3510b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> > mList; 3520b41448506610f73302cc631677823fd8b865ea5Christopher Tate Mutex mLock; 3530b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3540b41448506610f73302cc631677823fd8b865ea5Christopher Tatepublic: 35579dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate DeathRecipientList(); 3560b41448506610f73302cc631677823fd8b865ea5Christopher Tate ~DeathRecipientList(); 3570b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3580b41448506610f73302cc631677823fd8b865ea5Christopher Tate void add(const sp<JavaDeathRecipient>& recipient); 3590b41448506610f73302cc631677823fd8b865ea5Christopher Tate void remove(const sp<JavaDeathRecipient>& recipient); 3600b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<JavaDeathRecipient> find(jobject recipient); 361090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate 362090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate Mutex& lock(); // Use with care; specifically for mutual exclusion during binder death 3630b41448506610f73302cc631677823fd8b865ea5Christopher Tate}; 3640b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3650b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 3660b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectclass JavaDeathRecipient : public IBinder::DeathRecipient 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic: 370bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate JavaDeathRecipient(JNIEnv* env, jobject object, const sp<DeathRecipientList>& list) 37186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate : mVM(jnienv_to_javavm(env)), mObject(env->NewGlobalRef(object)), 37286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate mObjectWeak(NULL), mList(list) 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 3740b41448506610f73302cc631677823fd8b865ea5Christopher Tate // These objects manage their own lifetimes so are responsible for final bookkeeping. 3750b41448506610f73302cc631677823fd8b865ea5Christopher Tate // The list holds a strong reference to this object. 37679dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Adding JDR %p to DRL %p", this, list.get()); 377bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->add(this); 3780b41448506610f73302cc631677823fd8b865ea5Christopher Tate 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumDeathRefs); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void binderDied(const wp<IBinder>& who) 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 38579dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Receiving binderDied() on JavaDeathRecipient %p\n", this); 38686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 38786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 38886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 38986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->CallStaticVoidMethod(gBinderProxyOffsets.mClass, 39086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate gBinderProxyOffsets.mSendDeathNotice, mObject); 39198671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier if (env->ExceptionCheck()) { 39298671c34fa00a79c62ff0d9d874428bed1f86e92Mathieu Chartier jthrowable excep = env->ExceptionOccurred(); 39386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate report_exception(env, excep, 39486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate "*** Uncaught exception returned from death notification!"); 39586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 39686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 397090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate // Serialize with our containing DeathRecipientList so that we can't 398090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate // delete the global ref on mObject while the list is being iterated. 399090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate sp<DeathRecipientList> list = mList.promote(); 400090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate if (list != NULL) { 401090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate AutoMutex _l(list->lock()); 402090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate 403090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate // Demote from strong ref to weak after binderDied() has been delivered, 404090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate // to allow the DeathRecipient and BinderProxy to be GC'd if no longer needed. 405090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate mObjectWeak = env->NewWeakGlobalRef(mObject); 406090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate env->DeleteGlobalRef(mObject); 407090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate mObject = NULL; 408090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate } 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project void clearReference() 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 414bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> list = mList.promote(); 415bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate if (list != NULL) { 41679dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Removing JDR %p from DRL %p", this, list.get()); 417bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate list->remove(this); 41879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate } else { 41979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("clearReference() on JDR %p but DRL wp purged", this); 420bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate } 4210b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4220b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4230b41448506610f73302cc631677823fd8b865ea5Christopher Tate bool matches(jobject obj) { 42486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate bool result; 4250b41448506610f73302cc631677823fd8b865ea5Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 42686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate 42786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 42886284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate result = env->IsSameObject(obj, mObject); 42986284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } else { 43086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jobject me = env->NewLocalRef(mObjectWeak); 43186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate result = env->IsSameObject(obj, me); 43286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteLocalRef(me); 43386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 43486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate return result; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 437ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate void warnIfStillLive() { 438ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate if (mObject != NULL) { 439ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate // Okay, something is wrong -- we have a hard reference to a live death 440ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate // recipient on the VM side, but the list is being torn down. 441ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate JNIEnv* env = javavm_to_jnienv(mVM); 4420d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate ScopedLocalRef<jclass> objClassRef(env, env->GetObjectClass(mObject)); 4430d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate ScopedLocalRef<jstring> nameRef(env, 4440d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate (jstring) env->CallObjectMethod(objClassRef.get(), gClassOffsets.mGetName)); 4450d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate ScopedUtfChars nameUtf(env, nameRef.get()); 4460d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate if (nameUtf.c_str() != NULL) { 4478564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("BinderProxy is being destroyed but the application did not call " 4480d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate "unlinkToDeath to unlink all of its death recipients beforehand. " 4490d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate "Releasing leaked death recipient: %s", nameUtf.c_str()); 4500d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate } else { 4518564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("BinderProxy being destroyed; unable to get DR object name"); 4520d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate env->ExceptionClear(); 4530d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate } 454ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate } 455ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate } 456ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprotected: 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project virtual ~JavaDeathRecipient() 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { 4606215d3ff4b5dfa52a5d8b9a42e343051f31066a5Steve Block //ALOGI("Removing death ref: recipient=%p\n", mObject); 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumDeathRefs); 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv(mVM); 46386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate if (mObject != NULL) { 46486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteGlobalRef(mObject); 46586284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } else { 46686284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate env->DeleteWeakGlobalRef(mObjectWeak); 46786284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate } 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectprivate: 47186284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate JavaVM* const mVM; 47286284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jobject mObject; 47386284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate jweak mObjectWeak; // will be a weak ref to the same VM-side DeathRecipient after binderDied() 474bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate wp<DeathRecipientList> mList; 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 47979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher TateDeathRecipientList::DeathRecipientList() { 48079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("New DRL @ %p", this); 48179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate} 48279dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate 4830b41448506610f73302cc631677823fd8b865ea5Christopher TateDeathRecipientList::~DeathRecipientList() { 48479dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Destroy DRL @ %p", this); 4850b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 4860b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4870b41448506610f73302cc631677823fd8b865ea5Christopher Tate // Should never happen -- the JavaDeathRecipient objects that have added themselves 4880b41448506610f73302cc631677823fd8b865ea5Christopher Tate // to the list are holding references on the list object. Only when they are torn 4890b41448506610f73302cc631677823fd8b865ea5Christopher Tate // down can the list header be destroyed. 4900b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (mList.size() > 0) { 491ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 492ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 493ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate (*iter)->warnIfStillLive(); 494ac5e350e567c7a257ced37dd4e8ca0f4c95f7e81Christopher Tate } 4950b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 4960b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 4970b41448506610f73302cc631677823fd8b865ea5Christopher Tate 4980b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::add(const sp<JavaDeathRecipient>& recipient) { 4990b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5000b41448506610f73302cc631677823fd8b865ea5Christopher Tate 50179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("DRL @ %p : add JDR %p", this, recipient.get()); 5020b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.push_back(recipient); 5030b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5040b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5050b41448506610f73302cc631677823fd8b865ea5Christopher Tatevoid DeathRecipientList::remove(const sp<JavaDeathRecipient>& recipient) { 5060b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5070b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5080b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 5090b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 5100b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (*iter == recipient) { 51179dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("DRL @ %p : remove JDR %p", this, recipient.get()); 5120b41448506610f73302cc631677823fd8b865ea5Christopher Tate mList.erase(iter); 5130b41448506610f73302cc631677823fd8b865ea5Christopher Tate return; 5140b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5150b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5160b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5170b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5180b41448506610f73302cc631677823fd8b865ea5Christopher Tatesp<JavaDeathRecipient> DeathRecipientList::find(jobject recipient) { 5190b41448506610f73302cc631677823fd8b865ea5Christopher Tate AutoMutex _l(mLock); 5200b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5210b41448506610f73302cc631677823fd8b865ea5Christopher Tate List< sp<JavaDeathRecipient> >::iterator iter; 5220b41448506610f73302cc631677823fd8b865ea5Christopher Tate for (iter = mList.begin(); iter != mList.end(); iter++) { 5230b41448506610f73302cc631677823fd8b865ea5Christopher Tate if ((*iter)->matches(recipient)) { 5240b41448506610f73302cc631677823fd8b865ea5Christopher Tate return *iter; 5250b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5260b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 5270b41448506610f73302cc631677823fd8b865ea5Christopher Tate return NULL; 5280b41448506610f73302cc631677823fd8b865ea5Christopher Tate} 5290b41448506610f73302cc631677823fd8b865ea5Christopher Tate 530090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher TateMutex& DeathRecipientList::lock() { 531090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate return mLock; 532090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate} 533090c08ff2a7525c830b4edfd1a79aa8ee3893c60Christopher Tate 5340b41448506610f73302cc631677823fd8b865ea5Christopher Tate// ---------------------------------------------------------------------------- 5350b41448506610f73302cc631677823fd8b865ea5Christopher Tate 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void proxy_cleanup(const void* id, void* obj, void* cleanupCookie) 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JNIEnv* env = javavm_to_jnienv((JavaVM*)cleanupCookie); 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef((jobject)obj); 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic Mutex mProxyLock; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject javaObjectForIBinder(JNIEnv* env, const sp<IBinder>& val) 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val == NULL) return NULL; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (val->checkSubclass(&gBinderOffsets)) { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // One of our own! 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = static_cast<JavaBBinder*>(val.get())->object(); 55486284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate LOGDEATH("objectForBinder %p: it's our own %p!\n", val.get(), object); 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For the rest of the function we will hold this lock, to serialize 55910c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate // looking/creation/destruction of Java proxies for native Binder proxies. 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AutoMutex _l(mProxyLock); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Someone else's... do we know about it? 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject object = (jobject)val->findObject(&gBinderProxyOffsets); 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 565a4ca8ea0ad14c509d1ced46482e83c1b8a518982Jeff Brown jobject res = jniGetReferent(env, object); 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (res != NULL) { 56771f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("objectForBinder %p: found existing %p!\n", val.get(), res); 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 57086284c60b52c40f027427aa32dbe8dc0899b63d5Christopher Tate LOGDEATH("Proxy object %p of IBinder %p no longer in working set!!!", object, val.get()); 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_dec(&gNumProxyRefs); 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->detachObject(&gBinderProxyOffsets); 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->DeleteGlobalRef(object); 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project object = env->NewObject(gBinderProxyOffsets.mClass, gBinderProxyOffsets.mConstructor); 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (object != NULL) { 57879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("objectForBinder %p: created new proxy %p !\n", val.get(), object); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The proxy holds a reference to the native object. 5808ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(object, gBinderProxyOffsets.mObject, (jlong)val.get()); 581b1d90c8f60f71422196c337f1d078b68867f5710Mathias Agopian val->incStrong((void*)javaObjectForIBinder); 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // The native object needs to hold a weak reference back to the 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // proxy, so we can retrieve the same proxy if it is still active. 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject refObject = env->NewGlobalRef( 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env->GetObjectField(object, gBinderProxyOffsets.mSelf)); 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project val->attachObject(&gBinderProxyOffsets, refObject, 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jnienv_to_javavm(env), proxy_cleanup); 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 590bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // Also remember the death recipients registered on this proxy 591bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<DeathRecipientList> drl = new DeathRecipientList; 592bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate drl->incStrong((void*)javaObjectForIBinder); 5938ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(object, gBinderProxyOffsets.mOrgue, reinterpret_cast<jlong>(drl.get())); 594bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Note that a new object reference has been created. 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_inc(&gNumProxyRefs); 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project incRefsCreated(env); 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return object; 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectsp<IBinder> ibinderForJavaObject(JNIEnv* env, jobject obj) 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == NULL) return NULL; 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderOffsets.mClass)) { 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 6098ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderOffsets.mObject); 6100b41448506610f73302cc631677823fd8b865ea5Christopher Tate return jbh != NULL ? jbh->get(env, obj) : NULL; 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (env->IsInstanceOf(obj, gBinderProxyOffsets.mClass)) { 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (IBinder*) 6158ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6188564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("ibinderForJavaObject: %p is not a Binder object", obj); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjobject newParcelFileDescriptor(JNIEnv* env, jobject fileDesc) 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return env->NewObject( 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gParcelFileDescriptorOffsets.mClass, gParcelFileDescriptorOffsets.mConstructor, fileDesc); 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 628d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyvoid set_dalvik_blockguard_policy(JNIEnv* env, jint strict_policy) 629d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey{ 630d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // Call back into android.os.StrictMode#onBinderStrictModePolicyChange 631d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey // to sync our state back to it. See the comments in StrictMode.java. 632d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey env->CallStaticVoidMethod(gStrictModeCallbackOffsets.mClass, 633d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey gStrictModeCallbackOffsets.mCallback, 634d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey strict_policy); 635d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey} 636d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey 637d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyvoid signalExceptionForError(JNIEnv* env, jobject obj, status_t err, 638e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn bool canThrowRemoteException, int parcelSize) 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (err) { 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_ERROR: 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown error"); 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_MEMORY: 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case INVALID_OPERATION: 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/UnsupportedOperationException", NULL); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_VALUE: 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_INDEX: 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IndexOutOfBoundsException", NULL); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BAD_TYPE: 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalArgumentException", NULL); 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NAME_NOT_FOUND: 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", NULL); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case PERMISSION_DENIED: 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/SecurityException", NULL); 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NOT_ENOUGH_DATA: 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "android/os/ParcelFormatException", "Not enough data"); 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case NO_INIT: 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Not initialized"); 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case ALREADY_EXISTS: 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Item already exists"); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DEAD_OBJECT: 6750bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // DeadObjectException is a checked exception, only throw from certain methods. 6760bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jniThrowException(env, canThrowRemoteException 6770bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown ? "android/os/DeadObjectException" 6780bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown : "java/lang/RuntimeException", NULL); 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case UNKNOWN_TRANSACTION: 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", "Unknown transaction code"); 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 683e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn case FAILED_TRANSACTION: { 684e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn ALOGE("!!! FAILED BINDER TRANSACTION !!! (parcel size = %d)", parcelSize); 68502ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate const char* exceptionToThrow; 686e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn char msg[128]; 6870bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // TransactionTooLargeException is a checked exception, only throw from certain methods. 6880bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // FIXME: Transaction too large is the most common reason for FAILED_TRANSACTION 6890bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // but it is not the only one. The Binder driver can return BR_FAILED_REPLY 6900bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // for other reasons also, such as if the transaction is malformed or 6910bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // refers to an FD that has been closed. We should change the driver 6920bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // to enable us to distinguish these cases in the future. 69302ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate if (canThrowRemoteException && parcelSize > 200*1024) { 69402ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate // bona fide large payload 69502ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate exceptionToThrow = "android/os/TransactionTooLargeException"; 69602ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate snprintf(msg, sizeof(msg)-1, "data parcel size %d bytes", parcelSize); 69702ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate } else { 69802ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate // Heuristic: a payload smaller than this threshold "shouldn't" be too 69902ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate // big, so it's probably some other, more subtle problem. In practice 700ffd5864202a7c85620b7eb5032dc0120481705e5Christopher Tate // it seems to always mean that the remote process died while the binder 70102ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate // transaction was already in flight. 702ffd5864202a7c85620b7eb5032dc0120481705e5Christopher Tate exceptionToThrow = (canThrowRemoteException) 703ffd5864202a7c85620b7eb5032dc0120481705e5Christopher Tate ? "android/os/DeadObjectException" 704ffd5864202a7c85620b7eb5032dc0120481705e5Christopher Tate : "java/lang/RuntimeException"; 70502ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate snprintf(msg, sizeof(msg)-1, 70602ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate "Transaction failed on small parcel; remote process probably died"); 70702ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate } 70802ca7a7db04b000a8e403d130781fe65b4e0d091Christopher Tate jniThrowException(env, exceptionToThrow, msg); 709e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn } break; 7109ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn case FDS_NOT_ALLOWED: 7119ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 7129ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn "Not allowed to write file descriptors here"); 7139ecebbfbf768fd63e9a6c9a09c86d81c7737ee2dDianne Hackborn break; 714a94fc5243721350787ad405a94a64eec5dc61f7cChristopher Wiley case UNEXPECTED_NULL: 715a94fc5243721350787ad405a94a64eec5dc61f7cChristopher Wiley jniThrowNullPointerException(env, NULL); 716a94fc5243721350787ad405a94a64eec5dc61f7cChristopher Wiley break; 717cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -EBADF: 718cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 719cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "Bad file descriptor"); 720cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 721cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -ENFILE: 722cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 723cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "File table overflow"); 724cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 725cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -EMFILE: 726cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 727cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "Too many open files"); 728cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 729cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -EFBIG: 730cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 731cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "File too large"); 732cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 733cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -ENOSPC: 734cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 735cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "No space left on device"); 736cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 737cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -ESPIPE: 738cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 739cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "Illegal seek"); 740cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 741cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -EROFS: 742cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 743cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "Read-only file system"); 744cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 745cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn case -EMLINK: 746cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn jniThrowException(env, "java/lang/RuntimeException", 747cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn "Too many links"); 748cbefd8dd2befcb768f911a63becc427ec4c13250Dianne Hackborn break; 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 750cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn ALOGE("Unknown binder error code. 0x%" PRIx32, err); 7510bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown String8 msg; 752cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn msg.appendFormat("Unknown binder error code. 0x%" PRIx32, err); 7530bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown // RemoteException is a checked exception, only throw from certain methods. 7540bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jniThrowException(env, canThrowRemoteException 7550bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown ? "android/os/RemoteException" : "java/lang/RuntimeException", msg.string()); 7560bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown break; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingPid(JNIEnv* env, jobject clazz) 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingPid(); 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jint android_os_Binder_getCallingUid(JNIEnv* env, jobject clazz) 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->getCallingUid(); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jlong android_os_Binder_clearCallingIdentity(JNIEnv* env, jobject clazz) 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return IPCThreadState::self()->clearCallingIdentity(); 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_restoreCallingIdentity(JNIEnv* env, jobject clazz, jlong token) 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 781cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn // XXX temporary sanity check to debug crashes. 782cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn int uid = (int)(token>>32); 783cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn if (uid > 0 && uid < 999) { 784cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn // In Android currently there are no uids in this range. 785cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn char buf[128]; 786cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn sprintf(buf, "Restoring bad calling ident: 0x%" PRIx64, token); 787cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn jniThrowException(env, "java/lang/IllegalStateException", buf); 788cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn return; 789cf3004a46eabb49f3eee483067e75aef7b0a69e7Dianne Hackborn } 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->restoreCallingIdentity(token); 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 793727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic void android_os_Binder_setThreadStrictModePolicy(JNIEnv* env, jobject clazz, jint policyMask) 794727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 795727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick IPCThreadState::self()->setStrictModePolicy(policyMask); 796727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 797727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 798727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrickstatic jint android_os_Binder_getThreadStrictModePolicy(JNIEnv* env, jobject clazz) 799727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick{ 800727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick return IPCThreadState::self()->getStrictModePolicy(); 801727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick} 802727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_Binder_flushPendingCommands(JNIEnv* env, jobject clazz) 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IPCThreadState::self()->flushCommands(); 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8080b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_init(JNIEnv* env, jobject obj) 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8100b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaBBinderHolder* jbh = new JavaBBinderHolder(); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (jbh == NULL) { 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/OutOfMemoryError", NULL); 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 81571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Java Binder %p: acquiring first ref on holder %p", obj, jbh); 8160b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->incStrong((void*)android_os_Binder_init); 8178ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(obj, gBinderOffsets.mObject, (jlong)jbh); 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8200b41448506610f73302cc631677823fd8b865ea5Christopher Tatestatic void android_os_Binder_destroy(JNIEnv* env, jobject obj) 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project JavaBBinderHolder* jbh = (JavaBBinderHolder*) 8238ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderOffsets.mObject); 824582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown if (jbh != NULL) { 8258ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->SetLongField(obj, gBinderOffsets.mObject, 0); 82671f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Java Binder %p: removing ref on holder %p", obj, jbh); 8270b41448506610f73302cc631677823fd8b865ea5Christopher Tate jbh->decStrong((void*)android_os_Binder_init); 828582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } else { 829582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // Encountering an uninitialized binder is harmless. All it means is that 830582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // the Binder was only partially initialized when its finalizer ran and called 831582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // destroy(). The Binder could be partially initialized for several reasons. 832582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // For example, a Binder subclass constructor might have thrown an exception before 833582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // it could delegate to its superclass's constructor. Consequently init() would 834582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown // not have been called and the holder pointer would remain NULL. 83571f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Java Binder %p: ignoring uninitialized binder", obj); 836582763ae4e2910b4059dccdfd30a447e9fc974d5Jeff Brown } 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 839d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwalestatic void android_os_Binder_blockUntilThreadAvailable(JNIEnv* env, jobject clazz) 840d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwale{ 841d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwale return IPCThreadState::self()->blockUntilThreadAvailable(); 842d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwale} 843d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwale 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderMethods[] = { 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingPid", "()I", (void*)android_os_Binder_getCallingPid }, 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getCallingUid", "()I", (void*)android_os_Binder_getCallingUid }, 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "clearCallingIdentity", "()J", (void*)android_os_Binder_clearCallingIdentity }, 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "restoreCallingIdentity", "(J)V", (void*)android_os_Binder_restoreCallingIdentity }, 852727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "setThreadStrictModePolicy", "(I)V", (void*)android_os_Binder_setThreadStrictModePolicy }, 853727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick { "getThreadStrictModePolicy", "()I", (void*)android_os_Binder_getThreadStrictModePolicy }, 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "flushPendingCommands", "()V", (void*)android_os_Binder_flushPendingCommands }, 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "init", "()V", (void*)android_os_Binder_init }, 856d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwale { "destroy", "()V", (void*)android_os_Binder_destroy }, 857d7fdd0228e6abdbc079f9cf08b780e4222dfe7c5Wale Ogunwale { "blockUntilThreadAvailable", "()V", (void*)android_os_Binder_blockUntilThreadAvailable } 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderPathName = "android/os/Binder"; 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_Binder(JNIEnv* env) 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 864987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, kBinderPathName); 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 866987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 867987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderOffsets.mExecTransact = GetMethodIDOrDie(env, clazz, "execTransact", "(IJJI)Z"); 868987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 870ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie( 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderPathName, 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderMethods, NELEM(gBinderMethods)); 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectnamespace android { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getLocalObjectCount(JNIEnv* env, jobject clazz) 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumLocalRefs; 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getProxyObjectCount(JNIEnv* env, jobject clazz) 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumProxyRefs; 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectjint android_os_Debug_getDeathObjectCount(JNIEnv* env, jobject clazz) 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return gNumDeathRefs; 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jobject android_os_BinderInternal_getContextObject(JNIEnv* env, jobject clazz) 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return javaObjectForIBinder(env, b); 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_joinThreadPool(JNIEnv* env, jobject clazz) 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sp<IBinder> b = ProcessState::self()->getContextObject(NULL); 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android::IPCThreadState::self()->joinThreadPool(); 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 914887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackbornstatic void android_os_BinderInternal_disableBackgroundScheduling(JNIEnv* env, 915887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn jobject clazz, jboolean disable) 916887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn{ 917887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn IPCThreadState::disableBackgroundScheduling(disable ? true : false); 918887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn} 919887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn 920eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murraystatic void android_os_BinderInternal_setMaxThreads(JNIEnv* env, 921eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murray jobject clazz, jint maxThreads) 922eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murray{ 923eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murray ProcessState::self()->setThreadPoolMaxThreadCount(maxThreads); 924eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murray} 925eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murray 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz) 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 92871f2cf116aab893e224056c38ab146bd1538dd3eSteve Block ALOGV("Gc has executed, clearing binder ops"); 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project android_atomic_and(0, &gNumRefsCreated); 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderInternalMethods[] = { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "getContextObject", "()Landroid/os/IBinder;", (void*)android_os_BinderInternal_getContextObject }, 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "joinThreadPool", "()V", (void*)android_os_BinderInternal_joinThreadPool }, 938887f355f99ff83d568ef2885a4fdcaae475583dfDianne Hackborn { "disableBackgroundScheduling", "(Z)V", (void*)android_os_BinderInternal_disableBackgroundScheduling }, 939eef4a3d53cadaab782944923577d6aca7b7ba5c8Tim Murray { "setMaxThreads", "(I)V", (void*)android_os_BinderInternal_setMaxThreads }, 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project { "handleGc", "()V", (void*)android_os_BinderInternal_handleGc } 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderInternalPathName = "com/android/internal/os/BinderInternal"; 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderInternal(JNIEnv* env) 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 947987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, kBinderInternalPathName); 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 949987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderInternalOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 950987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderInternalOffsets.mForceGc = GetStaticMethodIDOrDie(env, clazz, "forceBinderGc", "()V"); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 952ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie( 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderInternalPathName, 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderInternalMethods, NELEM(gBinderInternalMethods)); 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_pingBinder(JNIEnv* env, jobject obj) 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 9648ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->pingBinder(); 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return err == NO_ERROR ? JNI_TRUE : JNI_FALSE; 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jstring android_os_BinderProxy_getInterfaceDescriptor(JNIEnv* env, jobject obj) 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9748ab665dda40ab10e60fc69392022171f454af530Ashok Bhat IBinder* target = (IBinder*) env->GetLongField(obj, gBinderProxyOffsets.mObject); 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target != NULL) { 9762c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick const String16& desc = target->getInterfaceDescriptor(); 9776698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert return env->NewString(reinterpret_cast<const jchar*>(desc.string()), 9786698749dd4d4d6513b26aa9071af290b956b68a7Dan Albert desc.size()); 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/RuntimeException", 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "No binder found for object"); 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return NULL; 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_isBinderAlive(JNIEnv* env, jobject obj) 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 9888ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bool alive = target->isBinderAlive(); 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alive ? JNI_TRUE : JNI_FALSE; 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9962c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic int getprocname(pid_t pid, char *buf, size_t len) { 997ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi char filename[32]; 9982c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick FILE *f; 9992c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 1000ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi snprintf(filename, sizeof(filename), "/proc/%d/cmdline", pid); 10012c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick f = fopen(filename, "r"); 1002ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi if (!f) { 1003ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi *buf = '\0'; 1004ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi return 1; 1005ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi } 1006ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi if (!fgets(buf, len, f)) { 1007ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi *buf = '\0'; 1008ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi fclose(f); 1009ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi return 2; 1010ec3d44cc7e5308cbfb166166da939a5b5ad216bcSungmin Choi } 10112c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick fclose(f); 10122c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return 0; 10132c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 10142c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10152c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_string(char** pos, const char* end, const char* str) { 10162c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick jint len = strlen(str); 10172c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(len) + len; 10182c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 10195b6da1aee884d32d8140e27c5b5b4d16ea4a37c8Mark Salyzyn ALOGW("not enough space for string. remain=%" PRIdPTR "; needed=%d", 1020cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn end - *pos, space_needed); 10212c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 10222c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10232c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_STRING; 10242c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 10252c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &len, sizeof(len)); 10262c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(len); 10272c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, str, len); 10282c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += len; 10292c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 10302c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 10312c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10322c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic bool push_eventlog_int(char** pos, const char* end, jint val) { 10332c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int space_needed = 1 + sizeof(val); 10342c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (end - *pos < space_needed) { 10355b6da1aee884d32d8140e27c5b5b4d16ea4a37c8Mark Salyzyn ALOGW("not enough space for int. remain=%" PRIdPTR "; needed=%d", 1036cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn end - *pos, space_needed); 10372c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return false; 10382c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10392c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick **pos = EVENT_TYPE_INT; 10402c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick (*pos)++; 10412c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick memcpy(*pos, &val, sizeof(val)); 10422c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *pos += sizeof(val); 10432c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return true; 10442c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 10452c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10462c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick// From frameworks/base/core/java/android/content/EventLogTags.logtags: 10470f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe 10480f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampestatic const bool kEnableBinderSample = false; 10490f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe 10502c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick#define LOGTAG_BINDER_OPERATION 52004 10512c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10522c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrickstatic void conditionally_log_binder_call(int64_t start_millis, 10532c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick IBinder* target, jint code) { 10542c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int duration_ms = static_cast<int>(uptimeMillis() - start_millis); 10552c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10562c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int sample_percent; 10572c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (duration_ms >= 500) { 10582c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100; 10592c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } else { 10602c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick sample_percent = 100 * duration_ms / 500; 10612c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent == 0) { 10622c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 10632c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10642c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (sample_percent < (random() % 100 + 1)) { 10652c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick return; 10662c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10672c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 10682c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10692c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char process_name[40]; 10702c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick getprocname(getpid(), process_name, sizeof(process_name)); 10712c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick String8 desc(target->getInterfaceDescriptor()); 10722c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 10732c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char buf[LOGGER_ENTRY_MAX_PAYLOAD]; 10742c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[0] = EVENT_TYPE_LIST; 10752c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick buf[1] = 5; 10762c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* pos = &buf[2]; 10772c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick char* end = &buf[LOGGER_ENTRY_MAX_PAYLOAD - 1]; // leave room for final \n 10782c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, desc.string())) return; 10792c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, code)) return; 10802c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, duration_ms)) return; 10812c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_string(&pos, end, process_name)) return; 10822c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick if (!push_eventlog_int(&pos, end, sample_percent)) return; 10832c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick *(pos++) = '\n'; // conventional with EVENT_TYPE_LIST apparently. 10842c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick android_bWriteLog(LOGTAG_BINDER_OPERATION, buf, pos - buf); 10852c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick} 10862c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 1087ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick// We only measure binder call durations to potentially log them if 108806451fe081d5ae79121a6f301475c7042f7f3a5dElliott Hughes// we're on the main thread. 1089ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrickstatic bool should_time_binder_calls() { 109006451fe081d5ae79121a6f301475c7042f7f3a5dElliott Hughes return (getpid() == gettid()); 1091ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick} 1092ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_transact(JNIEnv* env, jobject obj, 10940bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jint code, jobject dataObj, jobject replyObj, jint flags) // throws RemoteException 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dataObj == NULL) { 109769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* data = parcelForJavaObject(env, dataObj); 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (data == NULL) { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Parcel* reply = parcelForJavaObject(env, replyObj); 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (reply == NULL && replyObj != NULL) { 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 11118ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/lang/IllegalStateException", "Binder has been finalized!"); 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1117cfd91e7852bac3f9775cf3d05eedaade070cfecdMark Salyzyn ALOGV("Java code calling transact on %p in Java object %p with code %" PRId32 "\n", 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project target, obj, code); 11192c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 1120ad8fd282dde705ad090b2ecdc5b363df399230abBrad Fitzpatrick 11210f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe bool time_binder_calls; 11222c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick int64_t start_millis; 11230f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe if (kEnableBinderSample) { 11240f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe // Only log the binder call duration for things on the Java-level main thread. 11250f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe // But if we don't 11260f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe time_binder_calls = should_time_binder_calls(); 11270f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe 11280f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe if (time_binder_calls) { 11290f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe start_millis = uptimeMillis(); 11300f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe } 11312c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 11320f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //printf("Transact from Java code to %p sending: ", target); data->print(); 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project status_t err = target->transact(code, *data, reply, flags); 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project //if (reply) printf("Transact from Java code to %p received: ", target); reply->print(); 11360f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe 11370f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe if (kEnableBinderSample) { 11380f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe if (time_binder_calls) { 11390f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe conditionally_log_binder_call(start_millis, target, code); 11400f0b4919667f418b249c497f5ad3e83fdf4437e5Andreas Gampe } 11412c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick } 11422c5da313dd72c284fbc2c11839f8a452ab5ce574Brad Fitzpatrick 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR) { 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_TRUE; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (err == UNKNOWN_TRANSACTION) { 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1149e5c42621095a12e7d22ca5ab871dacd28c9bff41Dianne Hackborn signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/, data->dataSize()); 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_linkToDeath(JNIEnv* env, jobject obj, 11540bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown jobject recipient, jint flags) // throws RemoteException 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 115769a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return; 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 11628ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 11648564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project assert(false); 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 116879dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("linkToDeath: binder=%p recipient=%p\n", target, recipient); 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 1171bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 11728ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mOrgue); 1173bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> jdr = new JavaDeathRecipient(env, recipient, list); 11740b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = target->linkToDeath(jdr, NULL, flags); 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err != NO_ERROR) { 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Failure adding the death recipient, so clear its reference 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // now. 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jdr->clearReference(); 11790bde66a837542e5bd901d8b8e47c5bd7c4c99fe4Jeff Brown signalExceptionForError(env, obj, err, true /*canThrowRemoteException*/); 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic jboolean android_os_BinderProxy_unlinkToDeath(JNIEnv* env, jobject obj, 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jobject recipient, jint flags) 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jboolean res = JNI_FALSE; 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (recipient == NULL) { 118969a017bc1d1649350f830dfada5c6ed5eac0b770Elliott Hughes jniThrowNullPointerException(env, NULL); 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* target = (IBinder*) 11948ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (target == NULL) { 11968564c8da817a845353d213acd8636b76f567b234Steve Block ALOGW("Binder has been finalized when calling linkToDeath() with recip=%p)\n", recipient); 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return JNI_FALSE; 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 120079dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("unlinkToDeath: binder=%p recipient=%p\n", target, recipient); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!target->localBinder()) { 12030b41448506610f73302cc631677823fd8b865ea5Christopher Tate status_t err = NAME_NOT_FOUND; 1204bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 1205bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate // If we find the matching recipient, proceed to unlink using that 1206bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* list = (DeathRecipientList*) 12078ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mOrgue); 1208bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate sp<JavaDeathRecipient> origJDR = list->find(recipient); 120979dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH(" unlink found list %p and JDR %p", list, origJDR.get()); 12100b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (origJDR != NULL) { 12110b41448506610f73302cc631677823fd8b865ea5Christopher Tate wp<IBinder::DeathRecipient> dr; 12120b41448506610f73302cc631677823fd8b865ea5Christopher Tate err = target->unlinkToDeath(origJDR, NULL, flags, &dr); 12130b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (err == NO_ERROR && dr != NULL) { 12140b41448506610f73302cc631677823fd8b865ea5Christopher Tate sp<IBinder::DeathRecipient> sdr = dr.promote(); 12150b41448506610f73302cc631677823fd8b865ea5Christopher Tate JavaDeathRecipient* jdr = static_cast<JavaDeathRecipient*>(sdr.get()); 12160b41448506610f73302cc631677823fd8b865ea5Christopher Tate if (jdr != NULL) { 12170b41448506610f73302cc631677823fd8b865ea5Christopher Tate jdr->clearReference(); 12180b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 12190b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 12200b41448506610f73302cc631677823fd8b865ea5Christopher Tate } 12210b41448506610f73302cc631677823fd8b865ea5Christopher Tate 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (err == NO_ERROR || err == DEAD_OBJECT) { 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = JNI_TRUE; 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project jniThrowException(env, "java/util/NoSuchElementException", 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project "Death link does not exist"); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic void android_os_BinderProxy_destroy(JNIEnv* env, jobject obj) 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 123510c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate // Don't race with construction/initialization 123610c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate AutoMutex _l(mProxyLock); 123710c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project IBinder* b = (IBinder*) 12398ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mObject); 1240bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate DeathRecipientList* drl = (DeathRecipientList*) 12418ab665dda40ab10e60fc69392022171f454af530Ashok Bhat env->GetLongField(obj, gBinderProxyOffsets.mOrgue); 1242bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate 124379dd31f73d8ca4432d6f83bef1221cc3e93e932cChristopher Tate LOGDEATH("Destroying BinderProxy %p: binder=%p drl=%p\n", obj, b, drl); 124410c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate if (b != nullptr) { 124510c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate env->SetLongField(obj, gBinderProxyOffsets.mObject, 0); 124610c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate env->SetLongField(obj, gBinderProxyOffsets.mOrgue, 0); 124710c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate drl->decStrong((void*)javaObjectForIBinder); 124810c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate b->decStrong((void*)javaObjectForIBinder); 124910c3a2838c39bc88875628b49a902144df0f1d6aChristopher Tate } 12500b41448506610f73302cc631677823fd8b865ea5Christopher Tate 1251bd8b6f25bb48daea4aeb0c7463661c8e69baece0Christopher Tate IPCThreadState::self()->flushCommands(); 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// ---------------------------------------------------------------------------- 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic const JNINativeMethod gBinderProxyMethods[] = { 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /* name, signature, funcPtr */ 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"pingBinder", "()Z", (void*)android_os_BinderProxy_pingBinder}, 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"isBinderAlive", "()Z", (void*)android_os_BinderProxy_isBinderAlive}, 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"getInterfaceDescriptor", "()Ljava/lang/String;", (void*)android_os_BinderProxy_getInterfaceDescriptor}, 1261017c6a28bee788d2ba5550548ea844d0236bc40eDianne Hackborn {"transactNative", "(ILandroid/os/Parcel;Landroid/os/Parcel;I)Z", (void*)android_os_BinderProxy_transact}, 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"linkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)V", (void*)android_os_BinderProxy_linkToDeath}, 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"unlinkToDeath", "(Landroid/os/IBinder$DeathRecipient;I)Z", (void*)android_os_BinderProxy_unlinkToDeath}, 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project {"destroy", "()V", (void*)android_os_BinderProxy_destroy}, 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project}; 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectconst char* const kBinderProxyPathName = "android/os/BinderProxy"; 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectstatic int int_register_android_os_BinderProxy(JNIEnv* env) 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1271987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, "java/lang/Error"); 1272987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gErrorOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 1273987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 1274987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe clazz = FindClassOrDie(env, kBinderProxyPathName); 1275987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderProxyOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 1276987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderProxyOffsets.mConstructor = GetMethodIDOrDie(env, clazz, "<init>", "()V"); 1277987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderProxyOffsets.mSendDeathNotice = GetStaticMethodIDOrDie(env, clazz, "sendDeathNotice", 1278987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Landroid/os/IBinder$DeathRecipient;)V"); 1279987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 1280987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderProxyOffsets.mObject = GetFieldIDOrDie(env, clazz, "mObject", "J"); 1281987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderProxyOffsets.mSelf = GetFieldIDOrDie(env, clazz, "mSelf", 1282987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "Ljava/lang/ref/WeakReference;"); 1283987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gBinderProxyOffsets.mOrgue = GetFieldIDOrDie(env, clazz, "mOrgue", "J"); 1284987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 1285987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe clazz = FindClassOrDie(env, "java/lang/Class"); 1286987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gClassOffsets.mGetName = GetMethodIDOrDie(env, clazz, "getName", "()Ljava/lang/String;"); 12870d4a792e8d5ebfd182acc8db7cd9b40f3bc51640Christopher Tate 1288ed6b9dff563c5e22f040ff37e12c0d771e0478aeAndreas Gampe return RegisterMethodsOrDie( 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project env, kBinderProxyPathName, 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project gBinderProxyMethods, NELEM(gBinderProxyMethods)); 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project// **************************************************************************** 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1297d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkeyint register_android_os_Binder(JNIEnv* env) 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project{ 1299d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (int_register_android_os_Binder(env) < 0) 1300d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return -1; 1301d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (int_register_android_os_BinderInternal(env) < 0) 1302d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return -1; 1303d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey if (int_register_android_os_BinderProxy(env) < 0) 1304d84e1ce0b535128f03416145554fb405f9fade3eJeff Sharkey return -1; 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1306987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe jclass clazz = FindClassOrDie(env, "android/util/Log"); 1307987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gLogOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 1308987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gLogOffsets.mLogE = GetStaticMethodIDOrDie(env, clazz, "e", 1309987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Throwable;)I"); 1310987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 1311987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe clazz = FindClassOrDie(env, "android/os/ParcelFileDescriptor"); 1312987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gParcelFileDescriptorOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 1313987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gParcelFileDescriptorOffsets.mConstructor = GetMethodIDOrDie(env, clazz, "<init>", 1314987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "(Ljava/io/FileDescriptor;)V"); 1315987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe 1316987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe clazz = FindClassOrDie(env, "android/os/StrictMode"); 1317987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gStrictModeCallbackOffsets.mClass = MakeGlobalRefOrDie(env, clazz); 1318987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe gStrictModeCallbackOffsets.mCallback = GetStaticMethodIDOrDie(env, clazz, 1319987f79f60bb1f0a4bcd3ef22e57301c743f0b94fAndreas Gampe "onBinderStrictModePolicyChange", "(I)V"); 1320727de40c6bc7c6521a0542ea9def5d5c7b1c5e06Brad Fitzpatrick 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1323