diff options
Diffstat (limited to 'gdb/mi')
-rw-r--r-- | gdb/mi/mi-console.c | 17 | ||||
-rw-r--r-- | gdb/mi/mi-console.h | 3 | ||||
-rw-r--r-- | gdb/mi/mi-interp.c | 51 |
3 files changed, 70 insertions, 1 deletions
diff --git a/gdb/mi/mi-console.c b/gdb/mi/mi-console.c index 102b8be..b04e65c 100644 --- a/gdb/mi/mi-console.c +++ b/gdb/mi/mi-console.c @@ -135,4 +135,21 @@ mi_console_file_flush (struct ui_file *file) ui_file_put (mi_console->buffer, mi_console_raw_packet, mi_console); ui_file_rewind (mi_console->buffer); + +} + +/* Change the underlying stream of the console directly; this is + useful as a minimum-impact way to reflect external changes like + logging enable/disable. */ + +void +mi_console_set_raw (struct ui_file *file, struct ui_file *raw) +{ + struct mi_console_file *mi_console = ui_file_data (file); + + if (mi_console->magic != &mi_console_file_magic) + internal_error (__FILE__, __LINE__, + _("mi_console_file_set_raw: bad magic number")); + + mi_console->raw = raw; } diff --git a/gdb/mi/mi-console.h b/gdb/mi/mi-console.h index 9727eb6..7e9009f 100644 --- a/gdb/mi/mi-console.h +++ b/gdb/mi/mi-console.h @@ -24,4 +24,7 @@ extern struct ui_file *mi_console_file_new (struct ui_file *raw, const char *prefix, char quote); +extern void mi_console_set_raw (struct ui_file *console, + struct ui_file *raw); + #endif diff --git a/gdb/mi/mi-interp.c b/gdb/mi/mi-interp.c index ac0af70..b487136 100644 --- a/gdb/mi/mi-interp.c +++ b/gdb/mi/mi-interp.c @@ -755,6 +755,54 @@ mi_ui_out (struct interp *interp) return mi->uiout; } +/* Save the original value of raw_stdout here when logging, so we can + restore correctly when done. */ + +static struct ui_file *saved_raw_stdout; + +/* Do MI-specific logging actions; save raw_stdout, and change all + the consoles to use the supplied ui-file(s). */ + +static int +mi_set_logging (struct interp *interp, int start_log, + struct ui_file *out, struct ui_file *logfile) +{ + struct mi_interp *mi = interp_data (interp); + + if (!mi) + return 0; + + if (start_log) + { + /* The tee created already is based on gdb_stdout, which for MI + is a console and so we end up in an infinite loop of console + writing to ui_file writing to console etc. So discard the + existing tee (it hasn't been used yet, and MI won't ever use + it), and create one based on raw_stdout instead. */ + if (logfile) + { + ui_file_delete (out); + out = tee_file_new (raw_stdout, 0, logfile, 0); + } + + saved_raw_stdout = raw_stdout; + raw_stdout = out; + } + else + { + raw_stdout = saved_raw_stdout; + saved_raw_stdout = NULL; + } + + mi_console_set_raw (mi->out, raw_stdout); + mi_console_set_raw (mi->err, raw_stdout); + mi_console_set_raw (mi->log, raw_stdout); + mi_console_set_raw (mi->targ, raw_stdout); + mi_console_set_raw (mi->event_channel, raw_stdout); + + return 1; +} + extern initialize_file_ftype _initialize_mi_interp; /* -Wmissing-prototypes */ void @@ -767,7 +815,8 @@ _initialize_mi_interp (void) mi_interpreter_suspend, /* suspend_proc */ mi_interpreter_exec, /* exec_proc */ mi_interpreter_prompt_p, /* prompt_proc_p */ - mi_ui_out /* ui_out_proc */ + mi_ui_out, /* ui_out_proc */ + mi_set_logging /* set_logging_proc */ }; /* The various interpreter levels. */ |