[gdb] Print progress for debuginfod Prints progress like: Downloading 4.89 MB separate debug info for /usr/lib64/libgcrypt.so.20. Downloading 1.10 MB separate debug info for /usr/lib64/liblzma.so.5. Downloading 1.31 MB separate debug info for /usr/lib64/liblz4.so.1. Downloading 0.96 MB separate debug info for /usr/lib64/libsmime3.so. [### ] Tested on x86_64-linux. ChangeLog: 2020-12-10 Martin Liska Tom de Vries * gdb/debuginfod-support.c (struct user_data): Remove has_printed field. Add meter field. (progressfn): Print progress using meter. --- gdb/debuginfod-support.c | 24 ++++++++++++++++-------- 1 file changed, 16 insertions(+), 8 deletions(-) diff --git a/gdb/debuginfod-support.c b/gdb/debuginfod-support.c index 86630576e3..a17cb7c5a8 100644 --- a/gdb/debuginfod-support.c +++ b/gdb/debuginfod-support.c @@ -21,6 +21,8 @@ #include "cli/cli-style.h" #include "gdbsupport/scoped_fd.h" #include "debuginfod-support.h" +#include "gdbsupport/gdb_optional.h" +#include #ifndef HAVE_LIBDEBUGINFOD scoped_fd @@ -48,12 +50,12 @@ debuginfod_debuginfo_query (const unsigned char *build_id, struct user_data { user_data (const char *desc, const char *fname) - : desc (desc), fname (fname), has_printed (false) + : desc (desc), fname (fname) { } const char * const desc; const char * const fname; - bool has_printed; + gdb::optional meter; }; /* Deleter for a debuginfod_client. */ @@ -82,15 +84,21 @@ progressfn (debuginfod_client *c, long cur, long total) return 1; } - if (!data->has_printed && total != 0) + if (total == 0) + return 0; + + if (!data->meter.has_value ()) { - /* Print this message only once. */ - data->has_printed = true; - printf_filtered ("Downloading %s %ps...\n", - data->desc, - styled_string (file_name_style.style (), data->fname)); + float size_in_mb = 1.0f * total / (1024 * 1024); + std::stringstream message; + message.precision (2); + message << "Downloading " << size_in_mb << " MB " << data->desc + << " " << data->fname; + data->meter.emplace (current_uiout, message.str (), 1); } + current_uiout->progress ((double)cur / (double)total); + return 0; }