diff options
Diffstat (limited to 'libdimension/platform.c')
-rw-r--r-- | libdimension/platform.c | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/libdimension/platform.c b/libdimension/platform.c index e8f090d..b506c10 100644 --- a/libdimension/platform.c +++ b/libdimension/platform.c @@ -36,6 +36,9 @@ #if DMNSN_SCHED_GETAFFINITY #include <sched.h> /* For sched_getaffinity() */ #endif +#if DMNSN_TIMES + #include <sys/times.h> +#endif void dmnsn_backtrace(FILE *file) @@ -96,3 +99,33 @@ dmnsn_ncpus(void) return 1; #endif } + +#if DMNSN_TIMES +/** Clock ticks per second. */ +static long clk_tck = 0; +#endif + +void +dmnsn_get_times(dmnsn_timer *timer) +{ +#if DMNSN_TIMES + /* Figure out the clock ticks per second */ + if (!clk_tck) { + clk_tck = sysconf(_SC_CLK_TCK); + if (clk_tck == -1) { + dmnsn_error(DMNSN_SEVERITY_MEDIUM, "sysconf(_SC_CLK_TCK) failed."); + clk_tck = 1000000L; + } + } + + struct tms buf; + clock_t real = times(&buf); + timer->real = (double)real/clk_tck; + timer->user = (double)buf.tms_utime/clk_tck; + timer->system = (double)buf.tms_stime/clk_tck; +#else + timer->real = 0.0; + timer->user = 0.0; + timer->system = 0.0; +#endif +} |