summaryrefslogtreecommitdiff
path: root/progress.c
diff options
context:
space:
mode:
Diffstat (limited to 'progress.c')
-rw-r--r--progress.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/progress.c b/progress.c
index 29378caa05..289678d43d 100644
--- a/progress.c
+++ b/progress.c
@@ -34,8 +34,9 @@ struct progress {
unsigned total;
unsigned last_percent;
unsigned delay;
- unsigned delayed_percent_treshold;
+ unsigned delayed_percent_threshold;
struct throughput *throughput;
+ uint64_t start_ns;
};
static volatile sig_atomic_t progress_update;
@@ -87,7 +88,7 @@ static int display(struct progress *progress, unsigned n, const char *done)
return 0;
if (progress->total) {
unsigned percent = n * 100 / progress->total;
- if (percent > progress->delayed_percent_treshold) {
+ if (percent > progress->delayed_percent_threshold) {
/* inhibit this progress report entirely */
clear_progress_signal();
progress->delay = -1;
@@ -204,8 +205,8 @@ int display_progress(struct progress *progress, unsigned n)
return progress ? display(progress, n, NULL) : 0;
}
-struct progress *start_progress_delay(const char *title, unsigned total,
- unsigned percent_treshold, unsigned delay)
+static struct progress *start_progress_delay(const char *title, unsigned total,
+ unsigned percent_threshold, unsigned delay)
{
struct progress *progress = malloc(sizeof(*progress));
if (!progress) {
@@ -218,13 +219,19 @@ struct progress *start_progress_delay(const char *title, unsigned total,
progress->total = total;
progress->last_value = -1;
progress->last_percent = -1;
- progress->delayed_percent_treshold = percent_treshold;
+ progress->delayed_percent_threshold = percent_threshold;
progress->delay = delay;
progress->throughput = NULL;
+ progress->start_ns = getnanotime();
set_progress_signal();
return progress;
}
+struct progress *start_delayed_progress(const char *title, unsigned total)
+{
+ return start_progress_delay(title, total, 0, 2);
+}
+
struct progress *start_progress(const char *title, unsigned total)
{
return start_progress_delay(title, total, 0, 0);
@@ -247,8 +254,10 @@ void stop_progress_msg(struct progress **p_progress, const char *msg)
struct throughput *tp = progress->throughput;
if (tp) {
- unsigned int rate = !tp->avg_misecs ? 0 :
- tp->avg_bytes / tp->avg_misecs;
+ uint64_t now_ns = getnanotime();
+ unsigned int misecs, rate;
+ misecs = ((now_ns - progress->start_ns) * 4398) >> 32;
+ rate = tp->curr_total / (misecs ? misecs : 1);
throughput_string(&tp->display, tp->curr_total, rate);
}
progress_update = 1;