1
0
mirror of https://github.com/openbsd/src.git synced 2025-01-10 06:47:55 -08:00

Use the monotonic clock for logging progress in cdio(1) and ftp(1).

Keeps the progress log from blipping or stalling if, e.g., the
system time is changed in the midst of a rip or a transfer.

ok tb@ jca@
This commit is contained in:
cheloha 2017-12-23 20:04:23 +00:00
parent d56fac89cf
commit 5eb87a29ca
3 changed files with 34 additions and 30 deletions

View File

@ -1,4 +1,4 @@
/* $OpenBSD: mmc.c,v 1.30 2015/01/16 06:40:06 deraadt Exp $ */
/* $OpenBSD: mmc.c,v 1.31 2017/12/23 20:04:23 cheloha Exp $ */
/*
* Copyright (c) 2006 Michael Coulter <mjc@openbsd.org>
*
@ -16,6 +16,7 @@
*/
#include <sys/limits.h>
#include <sys/time.h>
#include <sys/types.h>
#include <sys/scsiio.h>
#include <sys/param.h> /* setbit, isset */
@ -27,6 +28,7 @@
#include <fcntl.h>
#include <stdio.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "extern.h"
@ -433,7 +435,7 @@ writetao(struct track_head *thp)
int
writetrack(struct track_info *tr, int track)
{
struct timeval tv, otv, atv;
struct timespec ts, ots, ats;
u_char databuf[65536], nblk;
u_int end_lba, lba, tmp;
scsireq_t scr;
@ -451,9 +453,9 @@ writetrack(struct track_info *tr, int track)
scr.senselen = SENSEBUFLEN;
scr.flags = SCCMD_ESCAPE|SCCMD_WRITE;
timerclear(&otv);
atv.tv_sec = 1;
atv.tv_usec = 0;
timespecclear(&ots);
ats.tv_sec = 1;
ats.tv_nsec = 0;
if (get_nwa(&lba) != SCCMD_OK) {
warnx("cannot get next writable address");
@ -500,13 +502,13 @@ again:
}
lba += nblk;
gettimeofday(&tv, NULL);
if (lba == end_lba || timercmp(&tv, &otv, >)) {
clock_gettime(CLOCK_MONOTONIC, &ts);
if (lba == end_lba || timespeccmp(&ts, &ots, >)) {
fprintf(stderr,
"\rtrack %02d '%c' %08u/%08u %3d%%",
track, tr->type,
lba, end_lba, 100 * lba / end_lba);
timeradd(&tv, &atv, &otv);
timespecadd(&ts, &ats, &ots);
}
tmp = htobe32(lba); /* update lba in cdb */
memcpy(&scr.cmd[2], &tmp, sizeof(tmp));

View File

@ -1,4 +1,4 @@
/* $OpenBSD: rip.c,v 1.16 2015/08/20 22:32:41 deraadt Exp $ */
/* $OpenBSD: rip.c,v 1.17 2017/12/23 20:04:23 cheloha Exp $ */
/*
* Copyright (c) 2007 Alexey Vatchenko <av@bsdua.org>
@ -23,6 +23,7 @@
#include <sys/ioctl.h>
#include <sys/scsiio.h>
#include <sys/stat.h>
#include <sys/time.h>
#include <scsi/scsi_all.h>
#include <scsi/scsi_disk.h>
@ -37,6 +38,7 @@
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include <unistd.h>
#include "extern.h"
@ -362,7 +364,7 @@ read_data_sector(u_int32_t lba, u_char *sec, u_int32_t secsize)
int
read_track(struct track *ti)
{
struct timeval tv, otv, atv;
struct timespec ts, ots, ats;
u_int32_t i, blksize, n_sec;
u_char *sec;
int error;
@ -373,18 +375,18 @@ read_track(struct track *ti)
if (sec == NULL)
return (-1);
timerclear(&otv);
atv.tv_sec = 1;
atv.tv_usec = 0;
timespecclear(&ots);
ats.tv_sec = 1;
ats.tv_nsec = 0;
for (i = 0; i < n_sec; ) {
gettimeofday(&tv, NULL);
if (timercmp(&tv, &otv, >)) {
clock_gettime(CLOCK_MONOTONIC, &ts);
if (timespeccmp(&ts, &ots, >)) {
fprintf(stderr, "\rtrack %u '%c' %08u/%08u %3u%%",
ti->track,
(ti->isaudio) ? 'a' : 'd', i, n_sec,
100 * i / n_sec);
timeradd(&tv, &atv, &otv);
timespecadd(&ts, &ats, &ots);
}
error = read_data_sector(i + ti->start_lba, sec, blksize);

View File

@ -1,4 +1,4 @@
/* $OpenBSD: util.c,v 1.85 2017/09/05 05:37:35 jca Exp $ */
/* $OpenBSD: util.c,v 1.86 2017/12/23 20:04:23 cheloha Exp $ */
/* $NetBSD: util.c,v 1.12 1997/08/18 10:20:27 lukem Exp $ */
/*-
@ -744,7 +744,7 @@ updateprogressmeter(int signo)
* with flag = 0
* - After the transfer, call with flag = 1
*/
static struct timeval start;
static struct timespec start;
char *action;
@ -757,21 +757,21 @@ progressmeter(int flag, const char *filename)
*/
static const char prefixes[] = " KMGTP";
static struct timeval lastupdate;
static struct timespec lastupdate;
static off_t lastsize;
static char *title = NULL;
struct timeval now, td, wait;
struct timespec now, td, wait;
off_t cursize, abbrevsize;
double elapsed;
int ratio, barlength, i, remaining, overhead = 30;
char buf[512];
if (flag == -1) {
(void)gettimeofday(&start, NULL);
clock_gettime(CLOCK_MONOTONIC, &start);
lastupdate = start;
lastsize = restart_point;
}
(void)gettimeofday(&now, NULL);
clock_gettime(CLOCK_MONOTONIC, &now);
if (!progress || filesize < 0)
return;
cursize = bytes + restart_point;
@ -851,19 +851,19 @@ progressmeter(int flag, const char *filename)
" %5lld %c%c ", (long long)abbrevsize, prefixes[i],
prefixes[i] == ' ' ? ' ' : 'B');
timersub(&now, &lastupdate, &wait);
timespecsub(&now, &lastupdate, &wait);
if (cursize > lastsize) {
lastupdate = now;
lastsize = cursize;
if (wait.tv_sec >= STALLTIME) { /* fudge out stalled time */
start.tv_sec += wait.tv_sec;
start.tv_usec += wait.tv_usec;
start.tv_nsec += wait.tv_nsec;
}
wait.tv_sec = 0;
}
timersub(&now, &start, &td);
elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
timespecsub(&now, &start, &td);
elapsed = td.tv_sec + (td.tv_nsec / 1000000000.0);
if (flag == 1) {
i = (int)elapsed / 3600;
@ -921,7 +921,7 @@ progressmeter(int flag, const char *filename)
void
ptransfer(int siginfo)
{
struct timeval now, td;
struct timespec now, td;
double elapsed;
off_t bs;
int meg, remaining, hh;
@ -930,9 +930,9 @@ ptransfer(int siginfo)
if (!verbose && !siginfo)
return;
(void)gettimeofday(&now, NULL);
timersub(&now, &start, &td);
elapsed = td.tv_sec + (td.tv_usec / 1000000.0);
clock_gettime(CLOCK_MONOTONIC, &now);
timespecsub(&now, &start, &td);
elapsed = td.tv_sec + (td.tv_nsec / 1000000000.0);
bs = bytes / (elapsed == 0.0 ? 1 : elapsed);
meg = 0;
if (bs > (1024 * 1024))