X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FGetTime.c;h=15643b8319e5420a967d395b82957c7f667f1e0c;hb=cf5905ea24904cf73a041fd7535e8723a668cb9a;hp=34fcd5c2a7b462b99baf43d6b4d85f2ab9514948;hpb=60610640fdf2f9b037f2d323f3e1127849e76028;p=ghc-hetmet.git diff --git a/rts/posix/GetTime.c b/rts/posix/GetTime.c index 34fcd5c..15643b8 100644 --- a/rts/posix/GetTime.c +++ b/rts/posix/GetTime.c @@ -46,10 +46,32 @@ Ticks getProcessCPUTime(void) { - struct rusage t; - getrusage(RUSAGE_SELF, &t); - return ((Ticks)t.ru_utime.tv_sec * TICKS_PER_SECOND + - ((Ticks)t.ru_utime.tv_usec * TICKS_PER_SECOND)/1000000); +#if !defined(BE_CONSERVATIVE) && defined(HAVE_CLOCK_GETTIME) && defined (_SC_CPUTIME) && defined(CLOCK_PROCESS_CPUTIME_ID) && defined(HAVE_SYSCONF) + static int checked_sysconf = 0; + static int sysconf_result = 0; + + if (!checked_sysconf) { + sysconf_result = sysconf(_SC_CPUTIME); + checked_sysconf = 1; + } + if (sysconf_result != -1) { + struct timespec ts; + int res; + res = clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &ts); + if (res == 0) { + return ((Ticks)ts.tv_sec * TICKS_PER_SECOND + + ((Ticks)ts.tv_nsec * TICKS_PER_SECOND) / 1000000000); + } + } +#endif + + // fallback to getrusage + { + struct rusage t; + getrusage(RUSAGE_SELF, &t); + return ((Ticks)t.ru_utime.tv_sec * TICKS_PER_SECOND + + ((Ticks)t.ru_utime.tv_usec * TICKS_PER_SECOND)/1000000); + } } Ticks getProcessElapsedTime(void) @@ -134,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 @@ -153,7 +184,7 @@ Ticks getThreadCPUTime(void) nat getPageFaults(void) { -#if !defined(HAVE_GETRUSAGE) || irix_HOST_OS +#if !defined(HAVE_GETRUSAGE) || irix_HOST_OS || haiku_HOST_OS return 0; #else struct rusage t;