X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FGetTime.c;h=34fcd5c2a7b462b99baf43d6b4d85f2ab9514948;hb=4c6a3f787abcaed009a574196d82237d9ae64fc8;hp=89d83a31cb35102a701f3519260daaa7fa4c990b;hpb=ab1e183aa7801f9260a9cbb6edbd553cf8249b25;p=ghc-hetmet.git diff --git a/rts/posix/GetTime.c b/rts/posix/GetTime.c index 89d83a3..34fcd5c 100644 --- a/rts/posix/GetTime.c +++ b/rts/posix/GetTime.c @@ -32,6 +32,10 @@ # include #endif +#ifdef USE_PAPI +# include +#endif + #if ! ((defined(HAVE_GETRUSAGE) && !irix_HOST_OS) || defined(HAVE_TIMES)) #error No implementation for getProcessCPUTime() available. #endif @@ -44,7 +48,7 @@ Ticks getProcessCPUTime(void) { struct rusage t; getrusage(RUSAGE_SELF, &t); - return (t.ru_utime.tv_sec * TICKS_PER_SECOND + + return ((Ticks)t.ru_utime.tv_sec * TICKS_PER_SECOND + ((Ticks)t.ru_utime.tv_usec * TICKS_PER_SECOND)/1000000); } @@ -52,7 +56,7 @@ Ticks getProcessElapsedTime(void) { struct timeval tv; gettimeofday(&tv, (struct timezone *) NULL); - return (tv.tv_sec * TICKS_PER_SECOND + + return ((Ticks)tv.tv_sec * TICKS_PER_SECOND + ((Ticks)tv.tv_usec * TICKS_PER_SECOND)/1000000); } @@ -68,9 +72,17 @@ void getProcessTimes(Ticks *user, Ticks *elapsed) Ticks getProcessCPUTime(void) { +#if !defined(THREADED_RTS) && USE_PAPI + long long usec; + if ((usec = PAPI_get_virt_usec()) < 0) { + barf("PAPI_get_virt_usec: %lld", usec); + } + return ((usec * TICKS_PER_SECOND) / 1000000); +#else Ticks user, elapsed; getProcessTimes(&user,&elapsed); return user; +#endif } Ticks getProcessElapsedTime(void) @@ -115,16 +127,27 @@ void getProcessTimes(Ticks *user, Ticks *elapsed) Ticks getThreadCPUTime(void) { -#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_THREAD_CPUTIME_ID) - // clock_gettime() gives us per-thread CPU time. It isn't - // reliable on Linux, but it's the best we have. - struct timespec ts; - clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts); - return (ts.tv_sec * TICKS_PER_SECOND + - ((Ticks)ts.tv_nsec * TICKS_PER_SECOND) / 1000000000); -#else - return getProcessCPUTime(); +#if USE_PAPI + long long usec; + if ((usec = PAPI_get_virt_usec()) < 0) { + barf("PAPI_get_virt_usec: %lld", usec); + } + 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); + } + } #endif + return getProcessCPUTime(); } nat