# HG changeset patch # User sla # Date 1413231099 -7200 # Node ID 6523fa019ffa77d611589850142f9a520fa81cfb # Parent 66521b7ba8d6cf636f953fd68897c280be2d4187 7102541: RFE: os::set_native_thread_name() cleanups Summary: implement os::set_native_thread_name() on windows, linux Reviewed-by: sla, ctornqvi, simonis Contributed-by: thomas.stuefe@sap.com diff -r 66521b7ba8d6 -r 6523fa019ffa hotspot/src/os/linux/vm/os_linux.cpp --- a/hotspot/src/os/linux/vm/os_linux.cpp Fri Oct 10 21:47:04 2014 +0000 +++ b/hotspot/src/os/linux/vm/os_linux.cpp Mon Oct 13 22:11:39 2014 +0200 @@ -129,6 +129,7 @@ int (*os::Linux::_clock_gettime)(clockid_t, struct timespec *) = NULL; int (*os::Linux::_pthread_getcpuclockid)(pthread_t, clockid_t *) = NULL; +int (*os::Linux::_pthread_setname_np)(pthread_t, const char*) = NULL; Mutex* os::Linux::_createThread_lock = NULL; pthread_t os::Linux::_main_thread; int os::Linux::_page_size = -1; @@ -4695,6 +4696,11 @@ StackRedPages = 1; StackShadowPages = round_to((StackShadowPages*Linux::vm_default_page_size()), vm_page_size()) / vm_page_size(); } + + // retrieve entry point for pthread_setname_np + Linux::_pthread_setname_np = + (int(*)(pthread_t, const char*))dlsym(RTLD_DEFAULT, "pthread_setname_np"); + } // To install functions for atexit system call @@ -4894,8 +4900,14 @@ } void os::set_native_thread_name(const char *name) { - // Not yet implemented. - return; + if (Linux::_pthread_setname_np) { + char buf [16]; // according to glibc manpage, 16 chars incl. '/0' + snprintf(buf, sizeof(buf), "%s", name); + buf[sizeof(buf) - 1] = '\0'; + const int rc = Linux::_pthread_setname_np(pthread_self(), buf); + // ERANGE should not happen; all other errors should just be ignored. + assert(rc != ERANGE, "pthread_setname_np failed"); + } } bool os::distribute_processes(uint length, uint* distribution) { diff -r 66521b7ba8d6 -r 6523fa019ffa hotspot/src/os/linux/vm/os_linux.hpp --- a/hotspot/src/os/linux/vm/os_linux.hpp Fri Oct 10 21:47:04 2014 +0000 +++ b/hotspot/src/os/linux/vm/os_linux.hpp Mon Oct 13 22:11:39 2014 +0200 @@ -55,6 +55,7 @@ static int (*_clock_gettime)(clockid_t, struct timespec *); static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *); + static int (*_pthread_setname_np)(pthread_t, const char*); static address _initial_thread_stack_bottom; static uintptr_t _initial_thread_stack_size; diff -r 66521b7ba8d6 -r 6523fa019ffa hotspot/src/os/windows/vm/os_windows.cpp --- a/hotspot/src/os/windows/vm/os_windows.cpp Fri Oct 10 21:47:04 2014 +0000 +++ b/hotspot/src/os/windows/vm/os_windows.cpp Mon Oct 13 22:11:39 2014 +0200 @@ -745,8 +745,29 @@ } void os::set_native_thread_name(const char *name) { - // Not yet implemented. - return; + + // See: http://msdn.microsoft.com/en-us/library/xcb2z8hs.aspx + // + // Note that unfortunately this only works if the process + // is already attached to a debugger; debugger must observe + // the exception below to show the correct name. + + const DWORD MS_VC_EXCEPTION = 0x406D1388; + struct { + DWORD dwType; // must be 0x1000 + LPCSTR szName; // pointer to name (in user addr space) + DWORD dwThreadID; // thread ID (-1=caller thread) + DWORD dwFlags; // reserved for future use, must be zero + } info; + + info.dwType = 0x1000; + info.szName = name; + info.dwThreadID = -1; + info.dwFlags = 0; + + __try { + RaiseException (MS_VC_EXCEPTION, 0, sizeof(info)/sizeof(DWORD), (const ULONG_PTR*)&info ); + } __except(EXCEPTION_CONTINUE_EXECUTION) {} } bool os::distribute_processes(uint length, uint* distribution) { diff -r 66521b7ba8d6 -r 6523fa019ffa hotspot/src/share/vm/runtime/thread.cpp --- a/hotspot/src/share/vm/runtime/thread.cpp Fri Oct 10 21:47:04 2014 +0000 +++ b/hotspot/src/share/vm/runtime/thread.cpp Mon Oct 13 22:11:39 2014 +0200 @@ -1287,6 +1287,7 @@ this->record_stack_base_and_size(); this->initialize_thread_local_storage(); + this->set_native_thread_name(this->name()); this->set_active_handles(JNIHandleBlock::allocate_block()); while (!_should_terminate) { assert(watcher_thread() == Thread::current(), "thread consistency check"); diff -r 66521b7ba8d6 -r 6523fa019ffa hotspot/src/share/vm/runtime/vmThread.cpp --- a/hotspot/src/share/vm/runtime/vmThread.cpp Fri Oct 10 21:47:04 2014 +0000 +++ b/hotspot/src/share/vm/runtime/vmThread.cpp Mon Oct 13 22:11:39 2014 +0200 @@ -241,6 +241,7 @@ assert(this == vm_thread(), "check"); this->initialize_thread_local_storage(); + this->set_native_thread_name(this->name()); this->record_stack_base_and_size(); // Notify_lock wait checks on active_handles() to rewait in // case of spurious wakeup, it should wait on the last