This patch introduces a new progress_expect() function, and modifies progress_update() to support "overall" progress, spanning multiple individual transfers.
The proposed implementation only needs a suitable progress_expect() call at the beginning, and does not require any changes to the actual progress callbacks. Instead, modified "total" values are fed to the callback function. Signed-off-by: Bernhard Nortmann <[email protected]> --- progress.c | 38 ++++++++++++++++++++++++++++++++++---- progress.h | 1 + 2 files changed, 35 insertions(+), 4 deletions(-) diff --git a/progress.c b/progress.c index 92a7d22..3c0b275 100644 --- a/progress.c +++ b/progress.c @@ -65,10 +65,12 @@ const char *format_ETA(double remaining) typedef struct { progress_cb_t callback; double start; /* start point (timestamp) for rate and ETA calculation */ + size_t expected_total; + size_t expected_done; } progress_private_t; static progress_private_t progress = { - .callback = NULL, .start = 0. + .callback = NULL, .start = 0., .expected_total = 0 }; /* Exposed functions to manipulate private variables */ @@ -80,7 +82,18 @@ void set_progress_callback(progress_cb_t callback) void progress_start(void) { - progress.start = gettime(); /* reset start time */ + /* zero "expected_done" value, reset start time */ + progress.expected_done = 0; + progress.start = gettime(); +} + +/* + * Instruct the progress update logic to expect multiple transfers, + * which should sum up to the given overall number of bytes. + */ +void progress_expect(size_t total_bytes) +{ + progress.expected_total = total_bytes; } /* @@ -92,8 +105,25 @@ void progress_start(void) */ void progress_update(size_t total, size_t done, bool quick) { - if (progress.callback) - progress.callback(total, done, quick); + if (progress.expected_total) { + /* + * Override current (partial) stats, passing totals instead. + * Note: We also set "quick" to 'false' to enforce display. + */ + if (progress.callback) + progress.callback(progress.expected_total, + done + progress.expected_done, false); + + if (done >= total) /* current transfer has completed */ + progress.expected_done += total; + } else { + /* + * progress.expected_total == 0, i.e. unset + * Just pass values through to the callback directly. + */ + if (progress.callback) + progress.callback(total, done, quick); + } } /* Return relative / "elapsed" time, since progress_start() */ diff --git a/progress.h b/progress.h index 28d3443..f13f0fe 100644 --- a/progress.h +++ b/progress.h @@ -33,6 +33,7 @@ double estimate(size_t remaining, double rate); void set_progress_callback(progress_cb_t callback); void progress_start(void); +void progress_expect(size_t total_bytes); void progress_update(size_t total, size_t done, bool quick); /* progress callback implementations for various display styles */ -- 2.4.6 -- You received this message because you are subscribed to the Google Groups "linux-sunxi" group. To unsubscribe from this group and stop receiving emails from it, send an email to [email protected]. For more options, visit https://groups.google.com/d/optout.
