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
--- 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) {
--- 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;
--- 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) {
--- 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");
--- 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