diff --git a/src/shared/pretty-print.c b/src/shared/pretty-print.c index 2c46f3e2dc..470aaf77ca 100644 --- a/src/shared/pretty-print.c +++ b/src/shared/pretty-print.c @@ -461,6 +461,12 @@ bool shall_tint_background(void) { void draw_progress_bar(const char *prefix, double percentage) { + /* We are going output a bunch of small strings that shall appear as a single line to STDERR which is + * unbuffered by default. Let's temporarily turn on full buffering, so that this is passed to the tty + * as a single buffer, to make things more efficient. */ + char buffer[LONG_LINE_MAX]; + setvbuf(stderr, buffer, _IOFBF, sizeof(buffer)); + fputc('\r', stderr); if (prefix) fputs(prefix, stderr); @@ -512,10 +518,16 @@ void draw_progress_bar(const char *prefix, double percentage) { fputc('\r', stderr); fflush(stderr); + + /* Disable buffering again */ + setvbuf(stderr, NULL, _IONBF, 0); } void clear_progress_bar(const char *prefix) { + char buffer[LONG_LINE_MAX]; + setvbuf(stderr, buffer, _IOFBF, sizeof(buffer)); + fputc('\r', stderr); if (terminal_is_dumb()) @@ -526,4 +538,7 @@ void clear_progress_bar(const char *prefix) { fputc('\r', stderr); fflush(stderr); + + /* Disable buffering again */ + setvbuf(stderr, NULL, _IONBF, 0); }