From d1aea30b2ade504550f7bb7996c808b9af1c415d Mon Sep 17 00:00:00 2001 From: Elliott Hughes Date: Sat, 25 Apr 2015 10:05:24 -0700 Subject: [PATCH] Fix POSIX timer thread naming. Spencer Low points out that we never actually set a name because the constant part of the string was longer than the kernel's maximum, and the kernel rejects long names rather than truncate. Shorten the fixed part of the string while still keeping it meaningful. 9999 POSIX timers should be enough for any process... Bug: https://code.google.com/p/android/issues/detail?id=170089 Change-Id: Ic05f07584c1eac160743519091a540ebbf8d7eb1 --- libc/bionic/posix_timers.cpp | 6 +++--- tests/pthread_test.cpp | 4 +++- 2 files changed, 6 insertions(+), 4 deletions(-) diff --git a/libc/bionic/posix_timers.cpp b/libc/bionic/posix_timers.cpp index bc3aeb21c..c8f71c831 100644 --- a/libc/bionic/posix_timers.cpp +++ b/libc/bionic/posix_timers.cpp @@ -174,10 +174,10 @@ int timer_create(clockid_t clock_id, sigevent* evp, timer_t* timer_id) { return -1; } - // Give the thread a meaningful name. + // Give the thread a specific meaningful name. // It can't do this itself because the kernel timer isn't created until after it's running. - char name[32]; - snprintf(name, sizeof(name), "POSIX interval timer %d", to_kernel_timer_id(timer)); + char name[16]; // 16 is the kernel-imposed limit. + snprintf(name, sizeof(name), "POSIX timer %d", to_kernel_timer_id(timer)); pthread_setname_np(timer->callback_thread, name); *timer_id = timer; diff --git a/tests/pthread_test.cpp b/tests/pthread_test.cpp index a299f02f7..a9d10978b 100644 --- a/tests/pthread_test.cpp +++ b/tests/pthread_test.cpp @@ -403,7 +403,9 @@ TEST(pthread, pthread_sigmask) { } TEST(pthread, pthread_setname_np__too_long) { - ASSERT_EQ(ERANGE, pthread_setname_np(pthread_self(), "this name is far too long for linux")); + // The limit is 15 characters --- the kernel's buffer is 16, but includes a NUL. + ASSERT_EQ(0, pthread_setname_np(pthread_self(), "123456789012345")); + ASSERT_EQ(ERANGE, pthread_setname_np(pthread_self(), "1234567890123456")); } TEST(pthread, pthread_setname_np__self) {