debuginfod-find -v enables a progressfn that prints the Progress every time the callback is called. For slow transfers or big downloads this can be really verbose (hundreds a times a second). Slow it down a bit, so it only prints the progress at most 5 times a second.
Signed-off-by: Mark Wielaard <m...@klomp.org> --- debuginfod/ChangeLog | 5 +++++ debuginfod/debuginfod-find.c | 24 +++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/debuginfod/ChangeLog b/debuginfod/ChangeLog index a02643e1..d4face2d 100644 --- a/debuginfod/ChangeLog +++ b/debuginfod/ChangeLog @@ -1,3 +1,8 @@ +2020-11-11 Mark Wielaard <m...@klomp.org> + + * debuginfod-find.c (progressfn): Use clock_gettime to print Progress + at most 5 times a second. + 2020-11-01 Érico N. Rolim <erico....@gmail.com> * debuginfod-client.c (debuginfod_init_cache): Use ACCESSPERMS for diff --git a/debuginfod/debuginfod-find.c b/debuginfod/debuginfod-find.c index 88a460f8..5f9bccc3 100644 --- a/debuginfod/debuginfod-find.c +++ b/debuginfod/debuginfod-find.c @@ -24,6 +24,7 @@ #include <stdio.h> #include <stdlib.h> #include <string.h> +#include <time.h> #include <argp.h> #include <unistd.h> #include <fcntl.h> @@ -64,7 +65,28 @@ static int verbose; int progressfn(debuginfod_client *c __attribute__((__unused__)), long a, long b) { - fprintf (stderr, "Progress %ld / %ld\n", a, b); + static bool first = true; + static struct timespec last; + struct timespec now; + uint64_t delta; + if (!first) + { + clock_gettime (CLOCK_MONOTONIC, &now); + delta = ((now.tv_sec - last.tv_sec) * 1000000 + + (now.tv_nsec - last.tv_nsec) / 1000); + } + else + { + first = false; + delta = 250000; + } + + /* Show progress the first time and then at most 5 times a second. */ + if (delta > 200000) + { + fprintf (stderr, "Progress %ld / %ld\n", a, b); + clock_gettime (CLOCK_MONOTONIC, &last); + } return 0; } -- 2.18.4