On 14 Oct 2014, at 22:08, Jonas 'Sortie' Termansen <sor...@maxsi.org> wrote:
> I noticed libressl's apps.c is using times(3), which is among the functions I > am > aggressively deprecating in my personal system. This patch switches it to use > the clock_gettime and getrusage instead. I pondered using CLOCK_VIRTUAL rather > than getrusage, but it turned out to be not be implemented and not portable. > > Unfortunately, OS X doesn't have clock_gettime, so the portable version will > have to add back a times call as a fallback, or perhaps use gettimeofday (but > this doesn't have the proper time-doesn't-go-backwards semantics). The OS X specific mach_timebase_info() and mach_absolute_time() are may be more appropriate as fallback. > I didn't use the useful, but non-standard timespecsub and TIMEVAL_TO_TIMESPEC > macros from sys/time.h to make things easier for the portable version. > Alternatively they could be used and a fallback implementation can be added to > the libressl time.h wrapper header. IMHO the macros are the better choice. Regards, Joerg > --- libressl-2.1.0/apps/apps.c 2014-10-11 18:58:11.000000000 +0200 > +++ libssl/apps/apps.c 2014-10-14 21:31:44.827167386 +0200 > @@ -126,7 +126,6 @@ > > #include <sys/types.h> > #include <sys/stat.h> > -#include <sys/times.h> > > #include <ctype.h> > #include <errno.h> > @@ -135,6 +134,7 @@ > #include <limits.h> > #include <string.h> > #include <strings.h> > +#include <time.h> > #include <unistd.h> > > #include "apps.h" > @@ -2203,25 +2203,40 @@ > #endif > /* !OPENSSL_NO_TLSEXT && !OPENSSL_NO_NEXTPROTONEG */ > > +static struct timespec ts_elapsed(struct timespec a, struct timespec b) > +{ > + a.tv_sec -= b.tv_sec; > + a.tv_nsec -= b.tv_nsec; > + if ( a.tv_nsec < 0 ) > + { > + a.tv_nsec += 1000000000L; > + a.tv_sec -= 1; > + } > + return a; > +} > + > double > app_tminterval(int stop, int usertime) > { > - double ret = 0; > - struct tms rus; > - clock_t now = times(&rus); > - static clock_t tmstart; > + static struct timespec start_ts; > + struct timespec now_ts; > > - if (usertime) > - now = rus.tms_utime; > + if (usertime) { > + struct rusage ru; > + getrusage(RUSAGE_SELF, &ru); > + now_ts.tv_sec = ru.ru_utime.tv_sec; > + now_ts.tv_nsec = ru.ru_utime.tv_usec * 1000L; > + } else { > + clock_gettime(CLOCK_MONOTONIC, &now_ts); > + } > > - if (stop == TM_START) > - tmstart = now; > - else { > - long int tck = sysconf(_SC_CLK_TCK); > - ret = (now - tmstart) / (double) tck; > + if (stop == TM_START) { > + start_ts = now_ts; > + return 0.0; > } > > - return (ret); > + struct timespec elapsed_ts = ts_elapsed(now_ts, start_ts); > + return (double) elapsed_ts.tv_sec + (double) elapsed_ts.tv_nsec / 1E9; > } > > int >