Fix getThreadCPUTime()
authorSimon Marlow <marlowsd@gmail.com>
Mon, 13 Sep 2010 15:38:38 +0000 (15:38 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Mon, 13 Sep 2010 15:38:38 +0000 (15:38 +0000)
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.

rts/posix/GetTime.c

index 39465cb..15643b8 100644 (file)
@@ -156,16 +156,25 @@ Ticks getThreadCPUTime(void)
     }
     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)
-    if (sysconf(_POSIX_THREAD_CPUTIME) != -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);
+#elif !defined(BE_CONSERVATIVE) && defined(HAVE_CLOCK_GETTIME) && defined (_SC_THREAD_CPUTIME) && defined(CLOCK_THREAD_CPUTIME_ID) && defined(HAVE_SYSCONF)
+    {
+        static int checked_sysconf = 0;
+        static int sysconf_result = 0;
+        
+        if (!checked_sysconf) {
+            sysconf_result = sysconf(_SC_THREAD_CPUTIME);
+            checked_sysconf = 1;
+        }
+        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