From 380bce13d94ff03c96e39ac1d834f382c5c730a1 Mon Sep 17 00:00:00 2001 From: NIIBE Yutaka Date: Tue, 7 Nov 2017 10:49:36 +0900 Subject: agent: Use clock or clock_gettime for calibration. * agent/protect.c (calibrate_get_time): Use clock or clock_gettime. -- For calibration, clock(3) is better than times(3) among UNIXen. Tested on NetBSD 7.1 and FreeBSD 11.1, using QEMU. Thanks to Damien Goutte-Gattat for the information of use of CLOCKS_PER_SEC; The old code with times(3) is not 100% correct, in terms of POSIX. It should have used sysconf (_SC_CLK_TCK) instead of CLOCKS_PER_SEC. CLOCKS_PER_SEC is specifically for clock(3). GnuPG-bug-id: 3056, 3276, 3472 Signed-off-by: NIIBE Yutaka --- agent/protect.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) (limited to 'agent/protect.c') diff --git a/agent/protect.c b/agent/protect.c index fe44f18c3..90690d950 100644 --- a/agent/protect.c +++ b/agent/protect.c @@ -23,6 +23,7 @@ #include #include #include +#include #include #include #include @@ -104,11 +105,14 @@ calibrate_get_time (struct calibrate_time_s *data) &data->creation_time, &data->exit_time, &data->kernel_time, &data->user_time); # endif -#else - struct tms tmp; +#elif defined (CLOCK_THREAD_CPUTIME_ID) + struct timespec tmp; - times (&tmp); - data->ticks = tmp.tms_utime; + clock_gettime (CLOCK_THREAD_CPUTIME_ID, &tmp); + data->ticks = (clock_t)(((unsigned long long)tmp.tv_sec * 1000000000 + + tmp.tv_nsec) * CLOCKS_PER_SEC / 1000000000); +#else + data->ticks = clock (); #endif } @@ -135,7 +139,7 @@ calibrate_elapsed_time (struct calibrate_time_s *starttime) } #else return (unsigned long)((((double) (stoptime.ticks - starttime->ticks)) - /CLOCKS_PER_SEC)*10000000); + /CLOCKS_PER_SEC)*1000); #endif } -- cgit v1.2.3