From f5b6e5590e0a2c1be10bc0bd0a3b141256fdf7fd Mon Sep 17 00:00:00 2001 From: Dmitriy Filchenko Date: Mon, 18 Jul 2016 16:00:35 -0700 Subject: [PATCH] Handle long process names correctly. pthread_setname_np() expects 16 or fewer characters for the name argument. When the process name is longer, we should trim it. Change-Id: I40be3a4212bdaab900c8eb30fa27aeeb7ed1b0d1 --- cmds/app_process/app_main.cpp | 4 +--- core/jni/AndroidRuntime.cpp | 10 +++++++++- core/jni/android_util_Process.cpp | 4 +--- include/android_runtime/AndroidRuntime.h | 2 +- 4 files changed, 12 insertions(+), 8 deletions(-) diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp index 2093579bb274a..72a21e326564c 100644 --- a/cmds/app_process/app_main.cpp +++ b/cmds/app_process/app_main.cpp @@ -299,9 +299,7 @@ int main(int argc, char* const argv[]) } if (!niceName.isEmpty()) { - const char* procName = niceName.string(); - pthread_setname_np(pthread_self(), procName); - runtime.setArgv0(procName); + runtime.setArgv0(niceName.string(), true /* setProcName */); } if (zygote) { diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 99cd2cfeda707..0bacebda69b97 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -269,7 +269,15 @@ AndroidRuntime::~AndroidRuntime() return jniRegisterNativeMethods(env, className, gMethods, numMethods); } -void AndroidRuntime::setArgv0(const char* argv0) { +void AndroidRuntime::setArgv0(const char* argv0, bool setProcName) { + if (setProcName) { + int len = strlen(argv0); + if (len < 15) { + pthread_setname_np(pthread_self(), argv0); + } else { + pthread_setname_np(pthread_self(), argv0 + len - 15); + } + } memset(mArgBlockStart, 0, mArgBlockLength); strlcpy(mArgBlockStart, argv0, mArgBlockLength); } diff --git a/core/jni/android_util_Process.cpp b/core/jni/android_util_Process.cpp index 1c8eea7d01f5a..2395ece338ca6 100644 --- a/core/jni/android_util_Process.cpp +++ b/core/jni/android_util_Process.cpp @@ -412,9 +412,7 @@ void android_os_Process_setArgV0(JNIEnv* env, jobject clazz, jstring name) } if (!name8.isEmpty()) { - const char* procName = name8.string(); - pthread_setname_np(pthread_self(), procName); - AndroidRuntime::getRuntime()->setArgv0(procName); + AndroidRuntime::getRuntime()->setArgv0(name8.string(), true /* setProcName */); } } diff --git a/include/android_runtime/AndroidRuntime.h b/include/android_runtime/AndroidRuntime.h index 9a3b990c45bc9..ed77d9aead087 100644 --- a/include/android_runtime/AndroidRuntime.h +++ b/include/android_runtime/AndroidRuntime.h @@ -44,7 +44,7 @@ public: Tool, }; - void setArgv0(const char* argv0); + void setArgv0(const char* argv0, bool setProcName = false); void addOption(const char* optionString, void* extra_info = NULL); /**