< prev index next >
src/hotspot/os/linux/os_linux.cpp
Print this page
@@ -5570,18 +5570,22 @@
return munmap(addr, bytes) == 0;
}
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();
+static jlong fast_cpu_time(Thread *thread) {
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;
+ 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)
// are used by JVM M&M and JVMTI to get user+sys or user CPU time
// of a thread.
@@ -5599,11 +5603,11 @@
}
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 */);
}
}
@@ -5615,11 +5619,11 @@
}
}
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);
}
}
< prev index next >