TUI stdout buffering cleanup

The TUI checks against gdb_stdout to decide when to buffer.  It seems
much cleaner to me to simply record this as an attribute of the stream
itself.
This commit is contained in:
Tom Tromey 2022-08-11 14:03:55 -06:00
parent b8043d2721
commit 90621f6922
3 changed files with 14 additions and 23 deletions

View file

@ -22,24 +22,11 @@
#include "tui/tui-command.h"
#include "tui.h"
tui_file::tui_file (FILE *stream)
: stdio_file (stream)
{}
/* All TUI I/O sent to the *_filtered and *_unfiltered functions
eventually ends up here. The fputs_unfiltered_hook is primarily
used by GUIs to collect all output and send it to the GUI, instead
of the controlling terminal. Only output to gdb_stdout and
gdb_stderr are sent to the hook. Everything else is sent on to
fputs to allow file I/O to be handled appropriately. */
void
tui_file::puts (const char *linebuffer)
{
tui_puts (linebuffer);
/* gdb_stdout is buffered, and the caller must gdb_flush it at
appropriate times. Other streams are not so buffered. */
if (this != gdb_stdout)
if (!m_buffered)
tui_refresh_cmd_win ();
}
@ -47,18 +34,14 @@ void
tui_file::write (const char *buf, long length_buf)
{
tui_write (buf, length_buf);
/* gdb_stdout is buffered, and the caller must gdb_flush it at
appropriate times. Other streams are not so buffered. */
if (this != gdb_stdout)
if (!m_buffered)
tui_refresh_cmd_win ();
}
void
tui_file::flush ()
{
/* gdb_stdout is buffered. Other files are always flushed on
every write. */
if (this == gdb_stdout)
if (m_buffered)
tui_refresh_cmd_win ();
stdio_file::flush ();
}

View file

@ -26,11 +26,19 @@
class tui_file : public stdio_file
{
public:
explicit tui_file (FILE *stream);
tui_file (FILE *stream, bool buffered)
: stdio_file (stream),
m_buffered (buffered)
{}
void write (const char *buf, long length_buf) override;
void puts (const char *) override;
void flush () override;
private:
/* True if this stream is buffered. */
bool m_buffered;
};
#endif /* TUI_TUI_FILE_H */

View file

@ -904,8 +904,8 @@ tui_initialize_io (void)
#endif
/* Create tui output streams. */
tui_stdout = new pager_file (new tui_file (stdout));
tui_stderr = new tui_file (stderr);
tui_stdout = new pager_file (new tui_file (stdout, true));
tui_stderr = new tui_file (stderr, false);
tui_stdlog = new timestamped_file (tui_stderr);
tui_out = new tui_ui_out (tui_stdout);