File time's realtime output and switch to clock_gettime().
diff --git a/toys/posix/time.c b/toys/posix/time.c
index 951a53d..1becad1 100644
--- a/toys/posix/time.c
+++ b/toys/posix/time.c
@@ -26,33 +26,28 @@
void time_main(void)
{
- struct timeval tv, tv2;
+ struct timespec ts, ts2;
struct rusage ru;
long long sec[3];
int stat, ii, idx, nano[3];
pid_t pid;
- char *label[] = {"\nreal"+!!FLAG(p), "user", "sys"},
- tab = toys.optflags ? ' ' : '\t';
+ char *labels[] = {"\nreal"+!!FLAG(p), "user", "sys"}, **label = labels,
+ *vlabels[] ={"Real", "User", "System"}, tab = toys.optflags ? ' ' : '\t';
- if (FLAG(v))
- memcpy(label, (char *[]){"Real", "User", "System"}, 3*sizeof(char *));
- gettimeofday(&tv, NULL);
+ if (FLAG(v)) label = vlabels;
+ clock_gettime(CLOCK_MONOTONIC, &ts);
if (!(pid = XVFORK())) xexec(toys.optargs);
wait4(pid, &stat, 0, &ru);
- gettimeofday(&tv2, NULL);
- if (tv.tv_usec > tv2.tv_usec) {
- tv2.tv_usec += 1000000;
- tv2.tv_sec--;
- }
- sec[0] = tv2.tv_sec-tv.tv_sec, nano[0] = tv2.tv_usec-tv.tv_usec;
+ clock_gettime(CLOCK_MONOTONIC, &ts2);
+ sec[0] = nanodiff(&ts, &ts2);
+ nano[0] = (sec[0] % 1000000000)/(toys.optflags ? 1000 : 1000000);
+ sec[0] /= 1000000000;
sec[1] = ru.ru_utime.tv_sec, nano[1] = ru.ru_utime.tv_usec;
sec[2] = ru.ru_stime.tv_sec, nano[2] = ru.ru_stime.tv_usec;
- for (ii = idx = 0; ii<3; ii++) {
- if (!toys.optflags) sec[ii] = (sec[ii]+500)/1000;
+ for (ii = idx = 0; ii<3; ii++)
idx += sprintf(toybuf+idx, "%s%s%c%lld.%0*d\n", label[ii],
FLAG(v) ? " time (s):" : "", tab, sec[ii],
- 3<<!!toys.optflags, nano[ii]);
- }
+ 6>>!toys.optflags, nano[ii]);
if (FLAG(v)) idx += sprintf(toybuf+idx,
"Max RSS (KiB): %ld\nMajor faults: %ld\n"
"Minor faults: %ld\nFile system inputs: %ld\nFile system outputs: %ld\n"