aboutsummaryrefslogtreecommitdiff
path: root/gdb/tui
diff options
context:
space:
mode:
authorDoug Evans <dje@google.com>2015-02-04 12:27:28 +0100
committerPedro Alves <palves@redhat.com>2015-02-04 12:27:28 +0100
commit518be979d905d8e8708c70149fdb3207aba53aa1 (patch)
tree96dcab35188d23687ff67cb799b0d3351bbcc22f /gdb/tui
parentf3853b34448594744f284fa96f26e41fd533a50d (diff)
downloadfsf-binutils-gdb-518be979d905d8e8708c70149fdb3207aba53aa1.zip
fsf-binutils-gdb-518be979d905d8e8708c70149fdb3207aba53aa1.tar.gz
fsf-binutils-gdb-518be979d905d8e8708c70149fdb3207aba53aa1.tar.bz2
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 <dje@google.com> Pedro Alves <palves@redhat.com> Eli Zaretskii <eliz@gnu.org> 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.
Diffstat (limited to 'gdb/tui')
-rw-r--r--gdb/tui/tui-command.c15
-rw-r--r--gdb/tui/tui-command.h3
-rw-r--r--gdb/tui/tui-file.c10
-rw-r--r--gdb/tui/tui-io.c9
4 files changed, 31 insertions, 6 deletions
diff --git a/gdb/tui/tui-command.c b/gdb/tui/tui-command.c
index d1a5ddb..3551063 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 8cc5be4..ede2ecc 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 b32cfa6..4b4b92c 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 2b5a166..21b2a00 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.