1 /* -----------------------------------------------------------------------------
3 * (c) The GHC Team 2005
5 * Machine-dependent time measurement functions
7 * ---------------------------------------------------------------------------*/
9 // Not POSIX, due to use of ru_majflt in getPageFaults()
10 // #include "PosixSource.h"
19 #ifdef HAVE_SYS_TIME_H
20 # include <sys/time.h>
23 #if HAVE_SYS_RESOURCE_H
24 # include <sys/resource.h>
31 #ifdef HAVE_SYS_TIMES_H
32 # include <sys/times.h>
35 #if ! ((defined(HAVE_GETRUSAGE) && !irix_HOST_OS) || defined(HAVE_TIMES))
36 #error No implementation for getProcessCPUTime() available.
39 #if defined(HAVE_GETTIMEOFDAY) && defined(HAVE_GETRUSAGE) && !irix_HOST_OS
40 // we'll implement getProcessCPUTime() and getProcessElapsedTime()
41 // separately, using getrusage() and gettimeofday() respectively
43 Ticks getProcessCPUTime(void)
46 getrusage(RUSAGE_SELF, &t);
47 return (t.ru_utime.tv_sec * TICKS_PER_SECOND +
48 ((Ticks)t.ru_utime.tv_usec * TICKS_PER_SECOND)/1000000);
51 Ticks getProcessElapsedTime(void)
54 gettimeofday(&tv, (struct timezone *) NULL);
55 return (tv.tv_sec * TICKS_PER_SECOND +
56 ((Ticks)tv.tv_usec * TICKS_PER_SECOND)/1000000);
59 void getProcessTimes(Ticks *user, Ticks *elapsed)
61 *user = getProcessCPUTime();
62 *elapsed = getProcessElapsedTime();
65 #elif defined(HAVE_TIMES)
67 // we'll use the old times() API.
69 Ticks getProcessCPUTime(void)
72 getProcessTimes(&user,&elapsed);
76 Ticks getProcessElapsedTime(void)
79 getProcessTimes(&user,&elapsed);
83 void getProcessTimes(Ticks *user, Ticks *elapsed)
85 static nat ClockFreq = 0;
88 #if defined(HAVE_SYSCONF)
90 ticks = sysconf(_SC_CLK_TCK);
92 errorBelch("sysconf\n");
93 stg_exit(EXIT_FAILURE);
96 #elif defined(CLK_TCK) /* defined by POSIX */
100 #elif defined(CLOCKS_PER_SEC)
101 ClockFreq = CLOCKS_PER_SEC;
103 errorBelch("can't get clock resolution");
104 stg_exit(EXIT_FAILURE);
109 clock_t r = times(&t);
110 *user = (((Ticks)t.tms_utime * TICKS_PER_SECOND) / ClockFreq);
111 *elapsed = (((Ticks)r * TICKS_PER_SECOND) / ClockFreq);
116 Ticks getThreadCPUTime(void)
118 #if defined(HAVE_CLOCK_GETTIME) && defined(CLOCK_THREAD_CPUTIME_ID)
119 // clock_gettime() gives us per-thread CPU time. It isn't
120 // reliable on Linux, but it's the best we have.
122 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
123 return (ts.tv_sec * TICKS_PER_SECOND +
124 ((Ticks)ts.tv_nsec * TICKS_PER_SECOND) / 1000000000);
126 return getProcessCPUTime();
133 #if !defined(HAVE_GETRUSAGE) || irix_HOST_OS
137 getrusage(RUSAGE_SELF, &t);