wget: use monotonic_sec instead of gettimeofday
zcip: use monotonic_us instead of gettimeofday
udhcpcd: simpler, shorter random_xid()
function old new delta
monotonic_sec - 41 +41
find_pair 164 180 +16
run_list_real 2018 2028 +10
cmp_main 547 555 +8
collect_ctx 112 119 +7
singlemount 4544 4549 +5
time_main 1124 1128 +4
static.start_sec - 4 +4
static.lastupdate_sec - 4 +4
sock - 4 +4
read_package_field 253 257 +4
pick 38 40 +2
get_next_line 145 147 +2
count_lines 59 61 +2
process_stdin 435 433 -2
xstrtoul_range_sfx 229 226 -3
static.initialized 4 1 -3
dhcprelay_main 1125 1122 -3
catcher 380 377 -3
arping_main 1969 1966 -3
s 8 4 -4
cfg 4 - -4
static.lastupdate 8 - -8
start 8 - -8
random_xid 95 33 -62
.rodata 129114 129050 -64
zcip_main 1731 1576 -155
progressmeter 1035 867 -168
------------------------------------------------------------------------------
(add/remove: 4/3 grow/shrink: 10/11 up/down: 113/-490) Total: -377 bytes
diff --git a/networking/wget.c b/networking/wget.c
index fc7f7c3..8be37a7 100644
--- a/networking/wget.c
+++ b/networking/wget.c
@@ -38,7 +38,6 @@
#if ENABLE_FEATURE_WGET_STATUSBAR
static void progressmeter(int flag);
static const char *curfile; /* Name of current file being transferred */
-static struct timeval start; /* Time a transfer started */
enum {
STALLTIME = 5 /* Seconds when xfer considered "stalled" */
};
@@ -683,30 +682,30 @@
setitimer(ITIMER_REAL, &itv, NULL);
}
-
static void
progressmeter(int flag)
{
- static struct timeval lastupdate;
+ static unsigned lastupdate_sec;
+ static unsigned start_sec;
static off_t lastsize, totalsize;
- struct timeval now, td, tvwait;
off_t abbrevsize;
- int elapsed, ratio, barlength, i;
+ unsigned since_last_update, elapsed;
+ unsigned ratio;
+ int barlength, i;
if (flag == -1) { /* first call to progressmeter */
- gettimeofday(&start, NULL);
- lastupdate = start;
+ start_sec = monotonic_sec();
+ lastupdate_sec = start_sec;
lastsize = 0;
totalsize = content_len + beg_range; /* as content_len changes.. */
}
- gettimeofday(&now, NULL);
ratio = 100;
if (totalsize != 0 && !chunked) {
- /* long long helps to have working ETA even if !LFS */
- ratio = (int) (100ULL * (transferred+beg_range) / totalsize);
- ratio = MIN(ratio, 100);
+ /* long long helps to have it working even if !LFS */
+ ratio = (unsigned) (100ULL * (transferred+beg_range) / totalsize);
+ if (ratio > 100) ratio = 100;
}
fprintf(stderr, "\r%-20.20s%4d%% ", curfile, ratio);
@@ -714,12 +713,13 @@
barlength = getttywidth() - 51;
if (barlength > 0) {
/* god bless gcc for variable arrays :) */
- char buf[barlength+1];
i = barlength * ratio / 100;
- memset(buf, '*', i);
- memset(buf + i, ' ', barlength - i);
- buf[barlength] = '\0';
- fprintf(stderr, "|%s|", buf);
+ {
+ char buf[i+1];
+ memset(buf, '*', i);
+ buf[i] = '\0';
+ fprintf(stderr, "|%s%*s|", buf, barlength - i, "");
+ }
}
i = 0;
abbrevsize = transferred + beg_range;
@@ -730,22 +730,28 @@
/* see http://en.wikipedia.org/wiki/Tera */
fprintf(stderr, "%6d %c%c ", (int)abbrevsize, " KMGTPEZY"[i], i?'B':' ');
- timersub(&now, &lastupdate, &tvwait);
- if (transferred > lastsize) {
- lastupdate = now;
- lastsize = transferred;
- if (tvwait.tv_sec >= STALLTIME)
- timeradd(&start, &tvwait, &start);
- tvwait.tv_sec = 0;
- }
- timersub(&now, &start, &td);
- elapsed = td.tv_sec;
+// Nuts! Ain't it easier to update progress meter ONLY when we transferred++?
+// FIXME: get rid of alarmtimer + updateprogressmeter mess
- if (tvwait.tv_sec >= STALLTIME) {
+ elapsed = monotonic_sec();
+ since_last_update = elapsed - lastupdate_sec;
+ if (transferred > lastsize) {
+ lastupdate_sec = elapsed;
+ lastsize = transferred;
+ if (since_last_update >= STALLTIME) {
+ /* We "cut off" these seconds from elapsed time
+ * by adjusting start time */
+ start_sec += since_last_update;
+ }
+ since_last_update = 0; /* we are un-stalled now */
+ }
+ elapsed -= start_sec; /* now it's "elapsed since start" */
+
+ if (since_last_update >= STALLTIME) {
fprintf(stderr, " - stalled -");
} else {
off_t to_download = totalsize - beg_range;
- if (transferred <= 0 || elapsed <= 0 || transferred > to_download || chunked) {
+ if (transferred <= 0 || (int)elapsed <= 0 || transferred > to_download || chunked) {
fprintf(stderr, "--:--:-- ETA");
} else {
/* to_download / (transferred/elapsed) - elapsed: */