1 /* -----------------------------------------------------------------------------
3 * (c) The GHC Team 2005
5 * Machine-dependent time measurement functions
7 * ---------------------------------------------------------------------------*/
9 #include "PosixSource.h"
17 #ifdef HAVE_SYS_TIME_H
18 # include <sys/time.h>
21 #if HAVE_SYS_RESOURCE_H
22 # include <sys/resource.h>
29 #ifdef HAVE_SYS_TIMES_H
30 # include <sys/times.h>
33 #if ! ((defined(HAVE_GETRUSAGE) && !irix_HOST_OS) || defined(HAVE_TIMES))
34 #error No implementation for getProcessCPUTime() available.
37 #if (defined(HAVE_GETTIMEOFDAY) && defined(HAVE_GETRUSAGE) && !irix_HOST_OS)
38 // we'll implement getProcessCPUTime() and getProcessElapsedTime()
39 // separately, using getrusage() and gettimeofday() respectively
41 Ticks getProcessCPUTime(void)
44 getrusage(RUSAGE_SELF, &t);
45 return (t.ru_utime.tv_sec * TICKS_PER_SECOND +
46 ((Ticks)t.ru_utime.tv_usec * TICKS_PER_SECOND)/1000000);
49 Ticks getProcessElapsedTime(void)
52 gettimeofday(&tv, (struct timezone *) NULL);
53 return (tv.tv_sec * TICKS_PER_SECOND +
54 ((Ticks)tv.tv_usec * TICKS_PER_SECOND)/1000000);
57 void getProcessTimes(Ticks *user, Ticks *elapsed)
59 *user = getProcessCPUTime();
60 *elapsed = getProcessElapsedTime();
63 #elif defined(HAVE_TIMES)
65 // we'll use the old times() API.
67 Ticks getProcessCPUTime(void)
70 getProcessTimes(&user,&elapsed);
74 Ticks getProcessElapsedTime(void)
77 getProcessTimes(&user,&elapsed);
81 void getProcessTimes(Ticks *user, Ticks *elapsed)
83 static nat ClockFreq = 0;
86 #if defined(HAVE_SYSCONF)
88 ticks = sysconf(_SC_CLK_TCK);
90 errorBelch("sysconf\n");
91 stg_exit(EXIT_FAILURE);
94 #elif defined(CLK_TCK) /* defined by POSIX */
98 #elif defined(CLOCKS_PER_SEC)
99 ClockFreq = CLOCKS_PER_SEC;
101 errorBelch("can't get clock resolution");
102 stg_exit(EXIT_FAILURE);
107 clock_t r = times(&t);
108 *user = (((Ticks)t.tms_utime * TICKS_PER_SECOND) / ClockFreq);
109 *elapsed = (((Ticks)r * TICKS_PER_SECOND) / ClockFreq);
114 Ticks getThreadCPUTime(void)
116 #ifdef HAVE_CLOCK_GETTIME
117 // clock_gettime() gives us per-thread CPU time. It isn't
118 // reliable on Linux, but it's the best we have.
120 clock_gettime(CLOCK_THREAD_CPUTIME_ID, &ts);
121 return (ts.tv_sec * TICKS_PER_SECOND +
122 ts.tv_nsec / (1000000000/TICKS_PER_SECOND));
124 return getProcessCPUTime();
131 #if !defined(HAVE_GETRUSAGE) || irix_HOST_OS
135 getrusage(RUSAGE_SELF, &t);