提交 3087773f 编写于 作者: S sla

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
上级 2f32cbc8
...@@ -136,6 +136,7 @@ uintptr_t os::Linux::_initial_thread_stack_size = 0; ...@@ -136,6 +136,7 @@ uintptr_t os::Linux::_initial_thread_stack_size = 0;
int (*os::Linux::_clock_gettime)(clockid_t, struct timespec *) = NULL; int (*os::Linux::_clock_gettime)(clockid_t, struct timespec *) = NULL;
int (*os::Linux::_pthread_getcpuclockid)(pthread_t, clockid_t *) = 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; Mutex* os::Linux::_createThread_lock = NULL;
pthread_t os::Linux::_main_thread; pthread_t os::Linux::_main_thread;
int os::Linux::_page_size = -1; int os::Linux::_page_size = -1;
...@@ -5054,6 +5055,11 @@ void os::init(void) { ...@@ -5054,6 +5055,11 @@ void os::init(void) {
StackRedPages = 1; StackRedPages = 1;
StackShadowPages = round_to((StackShadowPages*Linux::vm_default_page_size()), vm_page_size()) / vm_page_size(); 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 // To install functions for atexit system call
...@@ -5308,8 +5314,14 @@ int os::active_processor_count() { ...@@ -5308,8 +5314,14 @@ int os::active_processor_count() {
} }
void os::set_native_thread_name(const char *name) { void os::set_native_thread_name(const char *name) {
// Not yet implemented. if (Linux::_pthread_setname_np) {
return; 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) { bool os::distribute_processes(uint length, uint* distribution) {
......
...@@ -56,6 +56,7 @@ class Linux { ...@@ -56,6 +56,7 @@ class Linux {
static int (*_clock_gettime)(clockid_t, struct timespec *); static int (*_clock_gettime)(clockid_t, struct timespec *);
static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *); static int (*_pthread_getcpuclockid)(pthread_t, clockid_t *);
static int (*_pthread_setname_np)(pthread_t, const char*);
static address _initial_thread_stack_bottom; static address _initial_thread_stack_bottom;
static uintptr_t _initial_thread_stack_size; static uintptr_t _initial_thread_stack_size;
......
...@@ -744,8 +744,29 @@ int os::active_processor_count() { ...@@ -744,8 +744,29 @@ int os::active_processor_count() {
} }
void os::set_native_thread_name(const char *name) { 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) { bool os::distribute_processes(uint length, uint* distribution) {
......
...@@ -1310,6 +1310,7 @@ void WatcherThread::run() { ...@@ -1310,6 +1310,7 @@ void WatcherThread::run() {
this->record_stack_base_and_size(); this->record_stack_base_and_size();
this->initialize_thread_local_storage(); this->initialize_thread_local_storage();
this->set_native_thread_name(this->name());
this->set_active_handles(JNIHandleBlock::allocate_block()); this->set_active_handles(JNIHandleBlock::allocate_block());
while(!_should_terminate) { while(!_should_terminate) {
assert(watcher_thread() == Thread::current(), "thread consistency check"); assert(watcher_thread() == Thread::current(), "thread consistency check");
......
...@@ -252,6 +252,7 @@ void VMThread::run() { ...@@ -252,6 +252,7 @@ void VMThread::run() {
assert(this == vm_thread(), "check"); assert(this == vm_thread(), "check");
this->initialize_thread_local_storage(); this->initialize_thread_local_storage();
this->set_native_thread_name(this->name());
this->record_stack_base_and_size(); this->record_stack_base_and_size();
// Notify_lock wait checks on active_handles() to rewait in // Notify_lock wait checks on active_handles() to rewait in
// case of spurious wakeup, it should wait on the last // case of spurious wakeup, it should wait on the last
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册