From eef4a3d53cadaab782944923577d6aca7b7ba5c8 Mon Sep 17 00:00:00 2001 From: Tim Murray Date: Tue, 19 Apr 2016 14:14:20 -0700 Subject: [PATCH] Increase the max binder thread pool size for system_server. bug 28201939 Change-Id: Iaade417a26247970b96f0aaacb3844d72de6399c --- core/java/com/android/internal/os/BinderInternal.java | 2 ++ core/jni/android_util_Binder.cpp | 7 +++++++ services/java/com/android/server/SystemServer.java | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/core/java/com/android/internal/os/BinderInternal.java b/core/java/com/android/internal/os/BinderInternal.java index d77b998fa247b..ea4575aba9c0b 100644 --- a/core/java/com/android/internal/os/BinderInternal.java +++ b/core/java/com/android/internal/os/BinderInternal.java @@ -93,6 +93,8 @@ public class BinderInternal { * @hide */ public static final native void disableBackgroundScheduling(boolean disable); + + public static final native void setMaxThreads(int numThreads); static native final void handleGc(); diff --git a/core/jni/android_util_Binder.cpp b/core/jni/android_util_Binder.cpp index abc6c4b5e7cc0..5559d48a58b65 100644 --- a/core/jni/android_util_Binder.cpp +++ b/core/jni/android_util_Binder.cpp @@ -917,6 +917,12 @@ static void android_os_BinderInternal_disableBackgroundScheduling(JNIEnv* env, IPCThreadState::disableBackgroundScheduling(disable ? true : false); } +static void android_os_BinderInternal_setMaxThreads(JNIEnv* env, + jobject clazz, jint maxThreads) +{ + ProcessState::self()->setThreadPoolMaxThreadCount(maxThreads); +} + static void android_os_BinderInternal_handleGc(JNIEnv* env, jobject clazz) { ALOGV("Gc has executed, clearing binder ops"); @@ -930,6 +936,7 @@ static const JNINativeMethod gBinderInternalMethods[] = { { "getContextObject", "()Landroid/os/IBinder;", (void*)android_os_BinderInternal_getContextObject }, { "joinThreadPool", "()V", (void*)android_os_BinderInternal_joinThreadPool }, { "disableBackgroundScheduling", "(Z)V", (void*)android_os_BinderInternal_disableBackgroundScheduling }, + { "setMaxThreads", "(I)V", (void*)android_os_BinderInternal_setMaxThreads }, { "handleGc", "()V", (void*)android_os_BinderInternal_handleGc } }; diff --git a/services/java/com/android/server/SystemServer.java b/services/java/com/android/server/SystemServer.java index 8c2f559677c48..9f2ca591e6efc 100644 --- a/services/java/com/android/server/SystemServer.java +++ b/services/java/com/android/server/SystemServer.java @@ -165,6 +165,10 @@ public final class SystemServer { private static final String UNCRYPT_PACKAGE_FILE = "/cache/recovery/uncrypt_file"; private static final String BLOCK_MAP_FILE = "/cache/recovery/block.map"; + // maximum number of binder threads used for system_server + // will be higher than the system default + private static final int sMaxBinderThreads = 31; + /** * Default theme used by the system context. This is used to style * system-provided dialogs, such as the Power Off dialog, and other @@ -285,6 +289,9 @@ public final class SystemServer { // Ensure binder calls into the system always run at foreground priority. BinderInternal.disableBackgroundScheduling(true); + // Increase the number of binder threads in system_server + BinderInternal.setMaxThreads(sMaxBinderThreads); + // Prepare the main looper thread (this thread). android.os.Process.setThreadPriority( android.os.Process.THREAD_PRIORITY_FOREGROUND);