diff -r 1acfd2f56d72 -r 429b0997c16d src/hotspot/os/linux/os_linux.cpp --- a/src/hotspot/os/linux/os_linux.cpp Mon Jul 09 13:08:30 2018 -0700 +++ b/src/hotspot/os/linux/os_linux.cpp Mon Jul 09 20:17:32 2018 -0400 @@ -5555,14 +5555,18 @@ static jlong slow_thread_cpu_time(Thread *thread, bool user_sys_cpu_time); -static clockid_t thread_cpu_clockid(Thread* thread) { - pthread_t tid = thread->osthread()->pthread_id(); - clockid_t clockid; - - // Get thread clockid - int rc = os::Linux::pthread_getcpuclockid(tid, &clockid); - assert(rc == 0, "pthread_getcpuclockid is expected to return 0 code"); - return clockid; +static jlong fast_cpu_time(Thread *thread) { + clockid_t clockid; + int rc = os::Linux::pthread_getcpuclockid(thread->osthread()->pthread_id(), + &clockid); + if (rc == 0) { + return os::Linux::fast_thread_cpu_time(clockid); + } else { + // It's possible to encounter a terminated native thread that failed + // to detach itself from the VM - which should result in ESRCH. + assert_status(rc == ESRCH, rc, "pthread_getcpuclockid failed"); + return -1; + } } // current_thread_cpu_time(bool) and thread_cpu_time(Thread*, bool) @@ -5584,7 +5588,7 @@ jlong os::thread_cpu_time(Thread* thread) { // consistent with what current_thread_cpu_time() returns if (os::Linux::supports_fast_thread_cpu_time()) { - return os::Linux::fast_thread_cpu_time(thread_cpu_clockid(thread)); + return fast_cpu_time(thread); } else { return slow_thread_cpu_time(thread, true /* user + sys */); } @@ -5600,7 +5604,7 @@ jlong os::thread_cpu_time(Thread *thread, bool user_sys_cpu_time) { if (user_sys_cpu_time && os::Linux::supports_fast_thread_cpu_time()) { - return os::Linux::fast_thread_cpu_time(thread_cpu_clockid(thread)); + return fast_cpu_time(thread); } else { return slow_thread_cpu_time(thread, user_sys_cpu_time); }