Date: Wed, 24 Jan 2018 17:12:34 +0000 (UTC) From: Alan Somers <asomers@FreeBSD.org> To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r328343 - head/usr.bin/time Message-ID: <201801241712.w0OHCY6f043199@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: asomers Date: Wed Jan 24 17:12:34 2018 New Revision: 328343 URL: https://svnweb.freebsd.org/changeset/base/328343 Log: time(1): use clock_gettime(2) instead of gettimeofday(2) This is a prerequisite to adding support for the monotonic clock Reviewed by: ken, imp MFC after: 3 weeks Sponsored by: Spectra Logic Corp Differential Revision: https://reviews.freebsd.org/D14030 Modified: head/usr.bin/time/time.c Modified: head/usr.bin/time/time.c ============================================================================== --- head/usr.bin/time/time.c Wed Jan 24 17:04:01 2018 (r328342) +++ head/usr.bin/time/time.c Wed Jan 24 17:12:34 2018 (r328343) @@ -58,18 +58,19 @@ static const char rcsid[] = #include <stdlib.h> #include <stdint.h> #include <string.h> +#include <time.h> #include <unistd.h> static int getstathz(void); static void humantime(FILE *, long, long); -static void showtime(FILE *, struct timeval *, struct timeval *, +static void showtime(FILE *, struct timespec *, struct timespec *, struct rusage *); static void siginfo(int); static void usage(void); static sig_atomic_t siginfo_recvd; static char decimal_point; -static struct timeval before_tv; +static struct timespec before_ts; static int hflag, pflag; int @@ -80,7 +81,7 @@ main(int argc, char **argv) pid_t pid; struct rlimit rl; struct rusage ru; - struct timeval after; + struct timespec after; char *ofn = NULL; FILE *out = stderr; @@ -120,7 +121,8 @@ main(int argc, char **argv) setvbuf(out, (char *)NULL, _IONBF, (size_t)0); } - (void)gettimeofday(&before_tv, NULL); + if (clock_gettime(CLOCK_REALTIME, &before_ts)) + err(1, "clock_gettime"); switch(pid = fork()) { case -1: /* error */ err(1, "time"); @@ -139,16 +141,18 @@ main(int argc, char **argv) while (wait4(pid, &status, 0, &ru) != pid) { if (siginfo_recvd) { siginfo_recvd = 0; - (void)gettimeofday(&after, NULL); + if (clock_gettime(CLOCK_REALTIME, &after)) + err(1, "clock_gettime"); getrusage(RUSAGE_CHILDREN, &ru); - showtime(stdout, &before_tv, &after, &ru); + showtime(stdout, &before_ts, &after, &ru); } } - (void)gettimeofday(&after, NULL); + if (clock_gettime(CLOCK_REALTIME, &after)) + err(1, "clock_gettime"); if ( ! WIFEXITED(status)) warnx("command terminated abnormally"); exitonsig = WIFSIGNALED(status) ? WTERMSIG(status) : 0; - showtime(out, &before_tv, &after, &ru); + showtime(out, &before_ts, &after, &ru); if (lflag) { int hz = getstathz(); u_long ticks; @@ -237,7 +241,7 @@ getstathz(void) } static void -humantime(FILE *out, long sec, long usec) +humantime(FILE *out, long sec, long centisec) { long days, hrs, mins; @@ -255,18 +259,18 @@ humantime(FILE *out, long sec, long usec) fprintf(out, "%ldh", hrs); if (mins) fprintf(out, "%ldm", mins); - fprintf(out, "%ld%c%02lds", sec, decimal_point, usec); + fprintf(out, "%ld%c%02lds", sec, decimal_point, centisec); } static void -showtime(FILE *out, struct timeval *before, struct timeval *after, +showtime(FILE *out, struct timespec *before, struct timespec *after, struct rusage *ru) { after->tv_sec -= before->tv_sec; - after->tv_usec -= before->tv_usec; - if (after->tv_usec < 0) - after->tv_sec--, after->tv_usec += 1000000; + after->tv_nsec -= before->tv_nsec; + if (after->tv_nsec < 0) + after->tv_sec--, after->tv_nsec += 1000000000; if (pflag) { /* POSIX wants output that must look like @@ -274,7 +278,7 @@ showtime(FILE *out, struct timeval *before, struct tim at least two digits after the radix. */ fprintf(out, "real %jd%c%02ld\n", (intmax_t)after->tv_sec, decimal_point, - after->tv_usec/10000); + after->tv_nsec/10000000); fprintf(out, "user %jd%c%02ld\n", (intmax_t)ru->ru_utime.tv_sec, decimal_point, ru->ru_utime.tv_usec/10000); @@ -282,7 +286,7 @@ showtime(FILE *out, struct timeval *before, struct tim (intmax_t)ru->ru_stime.tv_sec, decimal_point, ru->ru_stime.tv_usec/10000); } else if (hflag) { - humantime(out, after->tv_sec, after->tv_usec/10000); + humantime(out, after->tv_sec, after->tv_nsec/10000000); fprintf(out, " real\t"); humantime(out, ru->ru_utime.tv_sec, ru->ru_utime.tv_usec/10000); fprintf(out, " user\t"); @@ -291,7 +295,7 @@ showtime(FILE *out, struct timeval *before, struct tim } else { fprintf(out, "%9jd%c%02ld real ", (intmax_t)after->tv_sec, decimal_point, - after->tv_usec/10000); + after->tv_nsec/10000000); fprintf(out, "%9jd%c%02ld user ", (intmax_t)ru->ru_utime.tv_sec, decimal_point, ru->ru_utime.tv_usec/10000);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201801241712.w0OHCY6f043199>