[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-16  Martin Liska  <mliska@suse.cz>
	    Tom de Vries  <tdevries@suse.de>

	* gdb/debuginfod-support.c (struct user_data): Remove has_printed
	field.  Add meter field.
	(progressfn): Print progress using meter.
This commit is contained in:
Martin Liska 2020-12-16 18:18:40 +01:00 committed by Tom de Vries
parent 2f2287318b
commit d6f26c9d28
3 changed files with 28 additions and 10 deletions

View File

@ -1,3 +1,10 @@
2020-12-16 Martin Liska <mliska@suse.cz>
Tom de Vries <tdevries@suse.de>
* gdb/debuginfod-support.c (struct user_data): Remove has_printed
field. Add meter field.
(progressfn): Print progress using meter.
2020-12-02 Enze Li <lienze2010@hotmail.com> 2020-12-02 Enze Li <lienze2010@hotmail.com>
* .gitignore: Add gnu global outputs. * .gitignore: Add gnu global outputs.

View File

@ -272,7 +272,7 @@ cli_ui_out::do_redirect (ui_file *outstream)
- printed for tty, SHOULD_PRINT == false: - printed for tty, SHOULD_PRINT == false:
<> <>
- printed for not-a-tty: - printed for not-a-tty:
<NAME...done. <NAME...
> >
*/ */
@ -348,7 +348,7 @@ cli_ui_out::do_progress_end ()
if (!stream->isatty ()) if (!stream->isatty ())
{ {
fprintf_unfiltered (stream, "done.\n"); fprintf_unfiltered (stream, "\n");
gdb_flush (stream); gdb_flush (stream);
} }
else if (meter.printing == PROGRESS) else if (meter.printing == PROGRESS)

View File

@ -21,6 +21,7 @@
#include "cli/cli-style.h" #include "cli/cli-style.h"
#include "gdbsupport/scoped_fd.h" #include "gdbsupport/scoped_fd.h"
#include "debuginfod-support.h" #include "debuginfod-support.h"
#include "gdbsupport/gdb_optional.h"
#ifndef HAVE_LIBDEBUGINFOD #ifndef HAVE_LIBDEBUGINFOD
scoped_fd scoped_fd
@ -46,12 +47,12 @@ debuginfod_debuginfo_query (const unsigned char *build_id,
struct user_data struct user_data
{ {
user_data (const char *desc, const char *fname) 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 desc;
const char * const fname; const char * const fname;
bool has_printed; gdb::optional<ui_out::progress_meter> meter;
}; };
/* Deleter for a debuginfod_client. */ /* Deleter for a debuginfod_client. */
@ -80,15 +81,25 @@ progressfn (debuginfod_client *c, long cur, long total)
return 1; return 1;
} }
if (!data->has_printed && total != 0) if (total == 0)
return 0;
if (!data->meter.has_value ())
{ {
/* Print this message only once. */ float size_in_mb = 1.0f * total / (1024 * 1024);
data->has_printed = true; string_file styled_filename (current_uiout->can_emit_style_escape ());
printf_filtered ("Downloading %s %ps...\n", fprintf_styled (&styled_filename,
data->desc, file_name_style.style (),
styled_string (file_name_style.style (), data->fname)); "%s",
data->fname);
std::string message
= string_printf ("Downloading %.2f MB %s %s", size_in_mb, data->desc,
styled_filename.c_str());
data->meter.emplace (current_uiout, message, 1);
} }
current_uiout->progress ((double)cur / (double)total);
return 0; return 0;
} }