diff options
Diffstat (limited to 'core/jni/android_util_Binder.cpp')
-rw-r--r-- | core/jni/android_util_Binder.cpp | 29 |
1 files changed, 24 insertions, 5 deletions
diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index d2d5186eb8a1..2068bd7bc8ea 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -88,6 +88,7 @@ static struct binderinternal_offsets_t jclass mClass; jmethodID mForceGc; jmethodID mProxyLimitCallback; + jmethodID mProxyWarningCallback; } gBinderInternalOffsets; @@ -1240,7 +1241,7 @@ static void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz) gCollectedAtRefs = gNumLocalRefsCreated + gNumDeathRefsCreated; } -static void android_os_BinderInternal_proxyLimitcallback(int uid) +static void android_os_BinderInternal_proxyLimitCallback(int uid) { JNIEnv *env = AndroidRuntime::getJNIEnv(); env->CallStaticVoidMethod(gBinderInternalOffsets.mClass, @@ -1254,6 +1255,20 @@ static void android_os_BinderInternal_proxyLimitcallback(int uid) } } +static void android_os_BinderInternal_proxyWarningCallback(int uid) +{ + JNIEnv *env = AndroidRuntime::getJNIEnv(); + env->CallStaticVoidMethod(gBinderInternalOffsets.mClass, + gBinderInternalOffsets.mProxyWarningCallback, + uid); + + if (env->ExceptionCheck()) { + ScopedLocalRef<jthrowable> excep(env, env->ExceptionOccurred()); + binder_report_exception(env, excep.get(), + "*** Uncaught exception in binderProxyWarningCallbackFromNative"); + } +} + static void android_os_BinderInternal_setBinderProxyCountEnabled(JNIEnv* env, jobject clazz, jboolean enable) { @@ -1278,9 +1293,10 @@ static jint android_os_BinderInternal_getBinderProxyCount(JNIEnv* env, jobject c } static void android_os_BinderInternal_setBinderProxyCountWatermarks(JNIEnv* env, jobject clazz, - jint high, jint low) + jint high, jint low, + jint warning) { - BpBinder::setBinderProxyCountWatermarks(high, low); + BpBinder::setBinderProxyCountWatermarks(high, low, warning); } // ---------------------------------------------------------------------------- @@ -1295,7 +1311,7 @@ static const JNINativeMethod gBinderInternalMethods[] = { { "nSetBinderProxyCountEnabled", "(Z)V", (void*)android_os_BinderInternal_setBinderProxyCountEnabled }, { "nGetBinderProxyPerUidCounts", "()Landroid/util/SparseIntArray;", (void*)android_os_BinderInternal_getBinderProxyPerUidCounts }, { "nGetBinderProxyCount", "(I)I", (void*)android_os_BinderInternal_getBinderProxyCount }, - { "nSetBinderProxyCountWatermarks", "(II)V", (void*)android_os_BinderInternal_setBinderProxyCountWatermarks} + { "nSetBinderProxyCountWatermarks", "(III)V", (void*)android_os_BinderInternal_setBinderProxyCountWatermarks} }; const char* const kBinderInternalPathName = "com/android/internal/os/BinderInternal"; @@ -1307,6 +1323,8 @@ static int int_register_android_os_BinderInternal(JNIEnv* env) gBinderInternalOffsets.mClass = MakeGlobalRefOrDie(env, clazz); gBinderInternalOffsets.mForceGc = GetStaticMethodIDOrDie(env, clazz, "forceBinderGc", "()V"); gBinderInternalOffsets.mProxyLimitCallback = GetStaticMethodIDOrDie(env, clazz, "binderProxyLimitCallbackFromNative", "(I)V"); + gBinderInternalOffsets.mProxyWarningCallback = + GetStaticMethodIDOrDie(env, clazz, "binderProxyWarningCallbackFromNative", "(I)V"); jclass SparseIntArrayClass = FindClassOrDie(env, "android/util/SparseIntArray"); gSparseIntArrayOffsets.classObject = MakeGlobalRefOrDie(env, SparseIntArrayClass); @@ -1315,7 +1333,8 @@ static int int_register_android_os_BinderInternal(JNIEnv* env) gSparseIntArrayOffsets.put = GetMethodIDOrDie(env, gSparseIntArrayOffsets.classObject, "put", "(II)V"); - BpBinder::setLimitCallback(android_os_BinderInternal_proxyLimitcallback); + BpBinder::setBinderProxyCountEventCallback(android_os_BinderInternal_proxyLimitCallback, + android_os_BinderInternal_proxyWarningCallback); return RegisterMethodsOrDie( env, kBinderInternalPathName, |