From 518be979d905d8e8708c70149fdb3207aba53aa1 Mon Sep 17 00:00:00 2001 From: Doug Evans Date: Wed, 4 Feb 2015 12:27:28 +0100 Subject: [PATCH] Speed up GDB's TUI output In the TUI mode, we call wrefresh after outputting every single character. This results in the I/O becoming very slow. Fix this by delaying refreshing the console window until an explicit flush of gdb_stdout is requested, or a write to any other (unbuffered) file is done. 2015-02-04 Doug Evans Pedro Alves Eli Zaretskii PR tui/17810 * tui/tui-command.c (tui_refresh_cmd_win): New function. * tui/tui-command.c (tui_refresh_cmd_win): Declare. * tui/tui-file.c: #include tui/tui-command.h. (tui_file_fputs): Refresh command window if stream is not gdb_stdout. (tui_file_flush): Refresh command window if stream is gdb_stdout. * tui/tui-io.c (tui_puts): Remove calls to wrefresh, fflush. --- gdb/ChangeLog | 12 ++++++++++++ gdb/tui/tui-command.c | 15 +++++++++++++++ gdb/tui/tui-command.h | 3 +++ gdb/tui/tui-file.c | 10 +++++++++- gdb/tui/tui-io.c | 9 ++++----- 5 files changed, 43 insertions(+), 6 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1116853641c..d5ec6d1617e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2015-02-04 Doug Evans + Pedro Alves + Eli Zaretskii + + PR tui/17810 + * tui/tui-command.c (tui_refresh_cmd_win): New function. + * tui/tui-command.c (tui_refresh_cmd_win): Declare. + * tui/tui-file.c: #include tui/tui-command.h. + (tui_file_fputs): Refresh command window if stream is not gdb_stdout. + (tui_file_flush): Refresh command window if stream is gdb_stdout. + * tui/tui-io.c (tui_puts): Remove calls to wrefresh, fflush. + 2015-02-04 Pedro Alves Fix build breakage. diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c index d1a5ddb67fd..355106383b8 100644 --- a/gdb/tui/tui-command.c +++ b/gdb/tui/tui-command.c @@ -129,3 +129,18 @@ tui_dispatch_ctrl_char (unsigned int ch) return c; } } + +/* See tui-command.h. */ + +void +tui_refresh_cmd_win (void) +{ + WINDOW *w = TUI_CMD_WIN->generic.handle; + + wrefresh (w); + + /* FIXME: It's not clear why this is here. + It was present in the original tui_puts code and is kept in order to + not introduce some subtle breakage. */ + fflush (stdout); +} diff --git a/gdb/tui/tui-command.h b/gdb/tui/tui-command.h index 8cc5be4f79d..ede2ecc9343 100644 --- a/gdb/tui/tui-command.h +++ b/gdb/tui/tui-command.h @@ -24,4 +24,7 @@ extern unsigned int tui_dispatch_ctrl_char (unsigned int); +/* Refresh the command window. */ +extern void tui_refresh_cmd_win (void); + #endif diff --git a/gdb/tui/tui-file.c b/gdb/tui/tui-file.c index b32cfa604d1..4b4b92c4342 100644 --- a/gdb/tui/tui-file.c +++ b/gdb/tui/tui-file.c @@ -20,7 +20,7 @@ #include "ui-file.h" #include "tui/tui-file.h" #include "tui/tui-io.h" - +#include "tui/tui-command.h" #include "tui.h" /* A ``struct ui_file'' that is compatible with all the legacy @@ -179,6 +179,10 @@ tui_file_fputs (const char *linebuffer, struct ui_file *file) else { tui_puts (linebuffer); + /* gdb_stdout is buffered, and the caller must gdb_flush it at + appropriate times. Other streams are not so buffered. */ + if (file != gdb_stdout) + tui_refresh_cmd_win (); } } @@ -239,6 +243,10 @@ tui_file_flush (struct ui_file *file) case astring: break; case afile: + /* gdb_stdout is buffered. Other files are always flushed on + every write. */ + if (file == gdb_stdout) + tui_refresh_cmd_win (); fflush (stream->ts_filestream); break; } diff --git a/gdb/tui/tui-io.c b/gdb/tui/tui-io.c index 2b5a1664552..21b2a001f5d 100644 --- a/gdb/tui/tui-io.c +++ b/gdb/tui/tui-io.c @@ -159,7 +159,10 @@ tui_putc (char c) tui_puts (buf); } -/* Print the string in the curses command window. */ +/* Print the string in the curses command window. + The output is buffered. It is up to the caller to refresh the screen + if necessary. */ + void tui_puts (const char *string) { @@ -201,10 +204,6 @@ tui_puts (const char *string) TUI_CMD_WIN->detail.command_info.curch); TUI_CMD_WIN->detail.command_info.start_line = TUI_CMD_WIN->detail.command_info.cur_line; - - /* We could defer the following. */ - wrefresh (w); - fflush (stdout); } /* Readline callback. -- 2.30.2