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
diff --git a/cmds/app_process/app_main.cpp b/cmds/app_process/app_main.cpp
index 2093579..72a21e3 100644
--- a/cmds/app_process/app_main.cpp
+++ b/cmds/app_process/app_main.cpp
@@ -299,9 +299,7 @@
}
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 99cd2cf..0bacebd 100644
--- a/core/jni/AndroidRuntime.cpp
+++ b/core/jni/AndroidRuntime.cpp
@@ -269,7 +269,15 @@
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 1c8eea7..2395ece 100644
--- a/core/jni/android_util_Process.cpp
+++ b/core/jni/android_util_Process.cpp
@@ -412,9 +412,7 @@
}
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 9a3b990..ed77d9a 100644
--- a/include/android_runtime/AndroidRuntime.h
+++ b/include/android_runtime/AndroidRuntime.h
@@ -44,7 +44,7 @@
Tool,
};
- void setArgv0(const char* argv0);
+ void setArgv0(const char* argv0, bool setProcName = false);
void addOption(const char* optionString, void* extra_info = NULL);
/**