diff options
author | Denys Vlasenko <vda.linux@googlemail.com> | 2011-02-11 12:59:11 +0100 |
---|---|---|
committer | Denys Vlasenko <vda.linux@googlemail.com> | 2011-02-11 12:59:11 +0100 |
commit | e52e67cb512e775fd83ca399cc807c363ba59dcc (patch) | |
tree | c2c4576c52baf48bc177628fcc933f3555997c87 | |
parent | 838d4bb0cd0805e1671073627d86baf100af021b (diff) | |
download | busybox-w32-e52e67cb512e775fd83ca399cc807c363ba59dcc.tar.gz busybox-w32-e52e67cb512e775fd83ca399cc807c363ba59dcc.tar.bz2 busybox-w32-e52e67cb512e775fd83ca399cc807c363ba59dcc.zip |
libbb/progress.c: make sure we never get negative ETA
function old new delta
bb_progress_update 738 733 -5
Signed-off-by: Denys Vlasenko <vda.linux@googlemail.com>
-rw-r--r-- | libbb/progress.c | 33 |
1 files changed, 17 insertions, 16 deletions
diff --git a/libbb/progress.c b/libbb/progress.c index 3999e0f38..1062e9a0d 100644 --- a/libbb/progress.c +++ b/libbb/progress.c | |||
@@ -79,16 +79,20 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, | |||
79 | int barlength; | 79 | int barlength; |
80 | int kiloscale; | 80 | int kiloscale; |
81 | 81 | ||
82 | beg_and_transferred = beg_size + transferred; | ||
83 | |||
84 | elapsed = monotonic_sec(); | 82 | elapsed = monotonic_sec(); |
85 | since_last_update = elapsed - p->lastupdate_sec; | 83 | since_last_update = elapsed - p->lastupdate_sec; |
86 | /* | 84 | |
87 | * Do not update on every call | 85 | if (totalsize != 0 && transferred >= totalsize - beg_size) { |
88 | * (we can be called on every network read!) | 86 | /* Last call. Do not skip this update */ |
89 | */ | 87 | transferred = totalsize - beg_size; /* sanitize just in case */ |
90 | if (since_last_update == 0 && beg_and_transferred < totalsize) | 88 | } |
89 | else if (since_last_update == 0) { | ||
90 | /* | ||
91 | * Do not update on every call | ||
92 | * (we can be called on every network read!) | ||
93 | */ | ||
91 | return; | 94 | return; |
95 | } | ||
92 | 96 | ||
93 | kiloscale = 0; | 97 | kiloscale = 0; |
94 | /* | 98 | /* |
@@ -101,32 +105,29 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, | |||
101 | /* | 105 | /* |
102 | * 64-bit CPU || small off_t: in either case, | 106 | * 64-bit CPU || small off_t: in either case, |
103 | * >> is cheap, single-word operation. | 107 | * >> is cheap, single-word operation. |
104 | * ... || strange off_t: also use this code (it is safe, | 108 | * ... || strange off_t: also use this code |
105 | * even if suboptimal), because 32/64 optimized one | 109 | * (it is safe, just suboptimal wrt code size), |
106 | * works only for 64-bit off_t. | 110 | * because 32/64 optimized one works only for 64-bit off_t. |
107 | */ | 111 | */ |
108 | if (totalsize >= (1 << 22)) { | 112 | if (totalsize >= (1 << 22)) { |
109 | totalsize >>= 10; | 113 | totalsize >>= 10; |
110 | beg_size >>= 10; | 114 | beg_size >>= 10; |
111 | transferred >>= 10; | 115 | transferred >>= 10; |
112 | beg_and_transferred >>= 10; | ||
113 | kiloscale = 1; | 116 | kiloscale = 1; |
114 | } | 117 | } |
115 | } else { | 118 | } else { |
116 | /* 32-bit CPU and 64-bit off_t. | 119 | /* 32-bit CPU and 64-bit off_t. |
117 | * Pick a shift (40 bits) which is easier to do on 32-bit CPU. | 120 | * Use a 40-bit shift, it is easier to do on 32-bit CPU. |
118 | */ | 121 | */ |
119 | if (totalsize >= (uoff_t)(1ULL << 54)) { | 122 | if (totalsize >= (uoff_t)(1ULL << 54)) { |
120 | totalsize = (uint32_t)(totalsize >> 32) >> 8; | 123 | totalsize = (uint32_t)(totalsize >> 32) >> 8; |
121 | beg_size = (uint32_t)(beg_size >> 32) >> 8; | 124 | beg_size = (uint32_t)(beg_size >> 32) >> 8; |
122 | transferred = (uint32_t)(transferred >> 32) >> 8; | 125 | transferred = (uint32_t)(transferred >> 32) >> 8; |
123 | beg_and_transferred = (uint32_t)(beg_and_transferred >> 32) >> 8; | ||
124 | kiloscale = 4; | 126 | kiloscale = 4; |
125 | } | 127 | } |
126 | } | 128 | } |
127 | 129 | ||
128 | if (beg_and_transferred > totalsize) | 130 | beg_and_transferred = beg_size + transferred; |
129 | beg_and_transferred = totalsize; | ||
130 | 131 | ||
131 | ratio = 100 * beg_and_transferred / totalsize; | 132 | ratio = 100 * beg_and_transferred / totalsize; |
132 | #if ENABLE_UNICODE_SUPPORT | 133 | #if ENABLE_UNICODE_SUPPORT |
@@ -163,7 +164,7 @@ void FAST_FUNC bb_progress_update(bb_progress_t *p, | |||
163 | p->lastupdate_sec = elapsed; | 164 | p->lastupdate_sec = elapsed; |
164 | p->lastsize = transferred; | 165 | p->lastsize = transferred; |
165 | if (since_last_update >= STALLTIME) { | 166 | if (since_last_update >= STALLTIME) { |
166 | /* We "cut off" these seconds from elapsed time | 167 | /* We "cut out" these seconds from elapsed time |
167 | * by adjusting start time */ | 168 | * by adjusting start time */ |
168 | p->start_sec += since_last_update; | 169 | p->start_sec += since_last_update; |
169 | } | 170 | } |