diff --git a/timing.cc b/timing.cc
index 4c60a1d36..028ef08a4 100644
--- a/timing.cc
+++ b/timing.cc
@@ -557,33 +557,10 @@ bool ScanProgressMeter::printStats(double perc_done,
double time_used_s;
double time_needed_s;
double time_left_s;
- time_t timet;
struct tm *ltime;
+ last_print = *now;
- if (perc_done) { /* catch "divide by zero" attempts */
- if (!now) {
- gettimeofday(&tvtmp, NULL);
- now = (const struct timeval *) &tvtmp;
- }
-
- /* OK, now lets estimate the time to finish */
- time_used_s = difftime(now->tv_sec, begin.tv_sec);
- time_needed_s = time_used_s / perc_done;
- time_left_s = time_needed_s - time_used_s;
-
- /* Here we go! */
- last_print = *now;
-
- /*TIMEVAL_MSEC_ADD(last_est, *now, (unsigned long)time_left_s*1000);*/
- last_est = *now;
- last_est.tv_sec += time_left_s;
-
- timet = last_est.tv_sec;
- ltime = localtime(&timet);
- assert(ltime);
- }
-
// If we're less than 1% done we probably don't have enough
// data for decent timing estimates. Also with perc_done == 0
// these elements will be nonsensical.
@@ -591,15 +568,36 @@ bool ScanProgressMeter::printStats(double perc_done,
log_write(LOG_STDOUT, "%s Timing: About %.2f%% done\n",
scantypestr, perc_done * 100);
log_flush(LOG_STDOUT);
- } else {
- log_write(LOG_STDOUT, "%s Timing: About %.2f%% done; ETC: %02d:%02d (%lu:%02lu:%02lu remaining)\n",
- scantypestr, perc_done * 100, ltime->tm_hour, ltime->tm_min, (unsigned long)(time_left_s / 3600),
- ((unsigned long)time_left_s % 3600) / 60, ((unsigned long)time_left_s % 60));
- log_write(LOG_XML, "\n",
- scantypestr, (unsigned long) now->tv_sec,
- perc_done * 100, (unsigned long)time_left_s, (unsigned long) last_est.tv_sec);
- log_flush(LOG_STDOUT|LOG_XML);
+ return true;
}
+
+ if (!now) {
+ gettimeofday(&tvtmp, NULL);
+ now = (const struct timeval *) &tvtmp;
+ }
+
+ /* OK, now lets estimate the time to finish */
+ time_used_s = difftime(now->tv_sec, begin.tv_sec);
+ time_needed_s = time_used_s / perc_done;
+ /* Add 0.5 to get the effect of rounding when truncating to an integer. */
+ time_left_s = time_needed_s - time_used_s + 0.5;
+
+ last_est = *now;
+ last_est.tv_sec += time_left_s;
+
+ /* Get the estimated time of day at completion */
+ ltime = localtime(&last_est.tv_sec);
+ assert(ltime);
+
+ log_write(LOG_STDOUT, "%s Timing: About %.2f%% done; ETC: %02d:%02d (%.f:%02.f:%02.f remaining)\n",
+ scantypestr, perc_done * 100, ltime->tm_hour, ltime->tm_min,
+ floor(time_left_s / 60.0 / 60.0),
+ floor(fmod(time_left_s / 60.0, 60.0)),
+ floor(fmod(time_left_s, 60.0)));
+ log_write(LOG_XML, "\n",
+ scantypestr, (unsigned long) now->tv_sec,
+ perc_done * 100, time_left_s, (unsigned long) last_est.tv_sec);
+ log_flush(LOG_STDOUT|LOG_XML);
return true;
}