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:
parent
d56fac89cf
commit
5eb87a29ca
@ -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));
|
||||
|
@ -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);
|
||||
|
@ -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))
|
||||
|
Loading…
Reference in New Issue
Block a user