From owner-svn-src-all@freebsd.org Wed Jan 24 17:12:34 2018 Return-Path: Delivered-To: svn-src-all@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id CBB91EB63A2; Wed, 24 Jan 2018 17:12:34 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 7A2EA6A375; Wed, 24 Jan 2018 17:12:34 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 74F0820887; Wed, 24 Jan 2018 17:12:34 +0000 (UTC) (envelope-from asomers@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id w0OHCY58043200; Wed, 24 Jan 2018 17:12:34 GMT (envelope-from asomers@FreeBSD.org) Received: (from asomers@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id w0OHCY6f043199; Wed, 24 Jan 2018 17:12:34 GMT (envelope-from asomers@FreeBSD.org) Message-Id: <201801241712.w0OHCY6f043199@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: asomers set sender to asomers@FreeBSD.org using -f From: Alan Somers Date: Wed, 24 Jan 2018 17:12:34 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r328343 - head/usr.bin/time X-SVN-Group: head X-SVN-Commit-Author: asomers X-SVN-Commit-Paths: head/usr.bin/time X-SVN-Commit-Revision: 328343 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-all@freebsd.org X-Mailman-Version: 2.1.25 Precedence: list List-Id: "SVN commit messages for the entire src tree \(except for " user" and " projects" \)" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 24 Jan 2018 17:12:35 -0000 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 #include #include +#include #include 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);