mirror of
https://github.com/openjdk/jdk.git
synced 2026-02-01 05:58:29 +00:00
7102541: RFE: os::set_native_thread_name() cleanups
Implement os::set_native_thread_name() on windows, linux Reviewed-by: sla, ctornqvi, simonis
This commit is contained in:
parent
c5dbe0cf46
commit
51866388d1
@ -129,6 +129,7 @@ uintptr_t os::Linux::_initial_thread_stack_size = 0;
|
||||
|
||||
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 @@ void os::init(void) {
|
||||
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 @@ int os::active_processor_count() {
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
@ -55,6 +55,7 @@ class Linux {
|
||||
|
||||
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;
|
||||
|
||||
@ -745,8 +745,29 @@ int os::active_processor_count() {
|
||||
}
|
||||
|
||||
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) {
|
||||
|
||||
@ -1287,6 +1287,7 @@ void WatcherThread::run() {
|
||||
|
||||
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");
|
||||
|
||||
@ -241,6 +241,7 @@ void VMThread::run() {
|
||||
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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user