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:
parent
f296249f58
commit
540c78258c
@ -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
|
||||
|
@ -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). */
|
||||
|
@ -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;
|
||||
|
Loading…
Reference in New Issue
Block a user