changeset 8981:bf1c9a3312a4

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
author sla
date Mon, 13 Oct 2014 22:11:39 +0200
parents 894c78fcb2ea
children af43bab3c5d0
files src/os/linux/vm/os_linux.cpp src/os/linux/vm/os_linux.hpp src/os/windows/vm/os_windows.cpp src/share/vm/runtime/thread.cpp src/share/vm/runtime/vmThread.cpp
diffstat 5 files changed, 40 insertions(+), 4 deletions(-) [+]
line wrap: on
line diff
--- a/src/os/linux/vm/os_linux.cpp	Fri May 17 07:44:31 2019 +0100
+++ b/src/os/linux/vm/os_linux.cpp	Mon Oct 13 22:11:39 2014 +0200
@@ -136,6 +136,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;
@@ -5054,6 +5055,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
@@ -5308,8 +5314,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/src/os/linux/vm/os_linux.hpp	Fri May 17 07:44:31 2019 +0100
+++ b/src/os/linux/vm/os_linux.hpp	Mon Oct 13 22:11:39 2014 +0200
@@ -56,6 +56,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/src/os/windows/vm/os_windows.cpp	Fri May 17 07:44:31 2019 +0100
+++ b/src/os/windows/vm/os_windows.cpp	Mon Oct 13 22:11:39 2014 +0200
@@ -744,8 +744,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/src/share/vm/runtime/thread.cpp	Fri May 17 07:44:31 2019 +0100
+++ b/src/share/vm/runtime/thread.cpp	Mon Oct 13 22:11:39 2014 +0200
@@ -1310,6 +1310,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/src/share/vm/runtime/vmThread.cpp	Fri May 17 07:44:31 2019 +0100
+++ b/src/share/vm/runtime/vmThread.cpp	Mon Oct 13 22:11:39 2014 +0200
@@ -252,6 +252,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