X-Git-Url: http://git.megacz.com/?a=blobdiff_plain;f=rts%2Fposix%2FGetTime.c;h=db7378d62b21923a84f9753fa80117dc04615f0c;hb=b88025eabcd83f65d1d81f09272f5172f06a60e7;hp=a2d9a3106060a6d387a1b3b59ead078d93b216f0;hpb=b214419d68962f9979fb3ddd22150a8a25960be5;p=ghc-hetmet.git diff --git a/rts/posix/GetTime.c b/rts/posix/GetTime.c index a2d9a31..db7378d 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 @@ -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,7 +127,14 @@ void getProcessTimes(Ticks *user, Ticks *elapsed) Ticks getThreadCPUTime(void) { -#if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_THREAD_CPUTIME_ID) +#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(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;