Incorporate feedback from bde and jilles regarding r265472 to dd(1).

* Don't use sysexits.h.  Just exit 1 on error and 0 otherwise.
* Don't sacrifice precision by converting the output of clock_gettime() to a
  double and then comparing the results.  Instead, subtract the values of
  the two clock_gettime() calls, then convert to double.
* Don't use CLOCK_MONOTONIC_PRECISE.  It's an unportable synonym for
  CLOCK_MONOTONIC.
* Use more appropriate names for some local variables.
* In the summary message, round elapsed time to the nearest microsecond.

Reported by:	bde, jilles
MFC after:	3 days
X-MFC-With:	265472
This commit is contained in:
Alan Somers 2014-05-08 19:10:04 +00:00
parent f296249f58
commit 540c78258c
3 changed files with 12 additions and 15 deletions

View File

@ -61,7 +61,6 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <time.h>
#include <unistd.h>
@ -126,7 +125,6 @@ static void
setup(void)
{
u_int cnt;
struct timespec tv;
if (in.name == NULL) {
in.name = "stdin";
@ -245,9 +243,8 @@ setup(void)
ctab = casetab;
}
if (clock_gettime(CLOCK_MONOTONIC_PRECISE, &tv))
err(EX_OSERR, "clock_gettime");
st.start = tv.tv_sec + tv.tv_nsec * 1.0e-9;
if (clock_gettime(CLOCK_MONOTONIC, &st.start))
err(1, "clock_gettime");
}
static void

View File

@ -64,7 +64,7 @@ typedef struct {
uintmax_t trunc; /* # of truncated records */
uintmax_t swab; /* # of odd-length swab blocks */
uintmax_t bytes; /* # of bytes written */
double start; /* start time of dd */
struct timespec start; /* start time of dd */
} STAT;
/* Flags (in ddflags). */

View File

@ -48,7 +48,6 @@ __FBSDID("$FreeBSD$");
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sysexits.h>
#include <time.h>
#include <unistd.h>
@ -58,18 +57,19 @@ __FBSDID("$FreeBSD$");
void
summary(void)
{
struct timespec tv, tv_res;
struct timespec end, ts_res;
double secs, res;
if (ddflags & C_NOINFO)
return;
if (clock_gettime(CLOCK_MONOTONIC_PRECISE, &tv))
err(EX_OSERR, "clock_gettime");
if (clock_getres(CLOCK_MONOTONIC_PRECISE, &tv_res))
err(EX_OSERR, "clock_getres");
secs = tv.tv_sec + tv.tv_nsec * 1.0e-9 - st.start;
res = tv_res.tv_sec + tv_res.tv_nsec * 1.0e-9;
if (clock_gettime(CLOCK_MONOTONIC, &end))
err(1, "clock_gettime");
if (clock_getres(CLOCK_MONOTONIC, &ts_res))
err(1, "clock_getres");
secs = (end.tv_sec - st.start.tv_sec) + \
(end.tv_nsec - st.start.tv_nsec) * 1e-9;
res = ts_res.tv_sec + ts_res.tv_nsec * 1e-9;
if (secs < res)
secs = res;
(void)fprintf(stderr,
@ -83,7 +83,7 @@ summary(void)
st.trunc, (st.trunc == 1) ? "block" : "blocks");
if (!(ddflags & C_NOXFER)) {
(void)fprintf(stderr,
"%ju bytes transferred in %.9f secs (%.0f bytes/sec)\n",
"%ju bytes transferred in %.6f secs (%.0f bytes/sec)\n",
st.bytes, secs, st.bytes / secs);
}
need_summary = 0;