Commit 960c61cd authored by Simon Marlow's avatar Simon Marlow
Browse files

Fix getThreadCPUTime()

ever since the patch "Check with sysconf _POSIX_THREAD_CPUTIME", it
has been returning incorrect results, because the sysconf variable to
check should have been _SC_THREAD_CPUTIME, not _POSIX_THREAD_CPUTIME.
parent 4a82c60e
...@@ -156,16 +156,25 @@ Ticks getThreadCPUTime(void) ...@@ -156,16 +156,25 @@ Ticks getThreadCPUTime(void)
} }
return ((usec * TICKS_PER_SECOND) / 1000000); return ((usec * TICKS_PER_SECOND) / 1000000);
#elif !defined(BE_CONSERVATIVE) && defined(HAVE_CLOCK_GETTIME) && defined (_POSIX_THREAD_CPUTIME) && defined(CLOCK_THREAD_CPUTIME_ID) && defined(HAVE_SYSCONF) #elif !defined(BE_CONSERVATIVE) && defined(HAVE_CLOCK_GETTIME) && defined (_SC_THREAD_CPUTIME) && defined(CLOCK_THREAD_CPUTIME_ID) && defined(HAVE_SYSCONF)
if (sysconf(_POSIX_THREAD_CPUTIME) != -1) { {
// clock_gettime() gives us per-thread CPU time. It isn't static int checked_sysconf = 0;
// reliable on Linux, but it's the best we have. static int sysconf_result = 0;
struct timespec ts;
int res; if (!checked_sysconf) {
res = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts); sysconf_result = sysconf(_SC_THREAD_CPUTIME);
if (res == 0) { checked_sysconf = 1;
return ((Ticks)ts.tv_sec * TICKS_PER_SECOND + }
((Ticks)ts.tv_nsec * TICKS_PER_SECOND) / 1000000000); if (sysconf_result != -1) {
// clock_gettime() gives us per-thread CPU time. It isn't
// reliable on Linux, but it's the best we have.
struct timespec ts;
int res;
res = clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
if (res == 0) {
return ((Ticks)ts.tv_sec * TICKS_PER_SECOND +
((Ticks)ts.tv_nsec * TICKS_PER_SECOND) / 1000000000);
}
} }
} }
#endif #endif
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment