Remove make_cleanup_restore_target_terminal

This removes make_cleanup_restore_target_terminal and generally
C++-ifies target terminal handling.  It changes all target_terminal_*
functions to be static members of a new target_terminal class and
changes the cleanup to be a scoped_* class.
make_cleanup_override_quit_handler is also removed in favor of simply
using scoped_restore.

Note that there are some files in this patch that I could not compile.
Considering that some of the rewrites were automated, and that none of
these files involed cleanups, I feel that this is relatively safe.

Regression tested by the buildbot.

gdb/ChangeLog
2017-09-20  Tom Tromey  <tom@tromey.com>

	* windows-nat.c (get_windows_debug_event, windows_wait)
	(do_initial_windows_stuff, windows_attach): Update.
	* utils.c (vwarning, internal_vproblem): Update.
	(ui_unregister_input_event_handler_cleanup)
	(prepare_to_handle_input): Remove.
	(class scoped_input_handler): New.
	(defaulted_query, prompt_for_continue): Update.
	* tui/tui-hooks.c (tui_refresh_frame_and_register_information):
	Update.
	* top.c (undo_terminal_modifications_before_exit): Update.
	* target/target.h (target_terminal_init, target_terminal_inferior)
	(target_terminal_ours): Don't declare.
	(class target_terminal): New.
	* target.h (target_terminal_is_inferior, target_terminal_is_ours)
	(target_terminal_ours_for_output)
	(make_cleanup_restore_target_terminal): Don't declare.
	(target_terminal_info): Remove.
	* target.c (enum terminal_state, terminal_state): Remove.
	(target_terminal::terminal_state): Define.
	(target_terminal::init): Rename from target_terminal_init.
	(target_terminal::inferior): Rename from
	target_terminal_inferior.
	(target_terminal::ours): Rename from target_terminal_ours.
	(target_terminal::ours_for_output): Rename from
	target_terminal_ours_for_output.
	(target_terminal::info): New method.
	(cleanup_restore_target_terminal)
	(make_cleanup_restore_target_terminal): Remove.
	* solib.c (handle_solib_event): Update.
	* remote.c (remote_serial_quit_handler): Update.
	(remote_terminal_inferior, remote_wait_as): Update.
	* record-full.c (record_full_wait_1): Update.
	* nto-procfs.c (procfs_create_inferior): Update.
	* nat/fork-inferior.c (startup_inferior): Update.
	* mi/mi-interp.c (mi_new_thread, mi_thread_exit)
	(mi_record_changed, mi_inferior_added, mi_inferior_appeared)
	(mi_inferior_exit, mi_inferior_removed, mi_traceframe_changed)
	(mi_tsv_created, mi_tsv_deleted, mi_tsv_modified)
	(mi_breakpoint_created, mi_breakpoint_deleted)
	(mi_breakpoint_modified, mi_on_resume, mi_solib_loaded)
	(mi_solib_unloaded, mi_command_param_changed, mi_memory_changed)
	(mi_user_selected_context_changed, report_initial_inferior):
	Update.
	* linux-nat.c (linux_nat_attach, linux_nat_terminal_ours)
	(linux_nat_terminal_inferior): Update.
	* infrun.c (follow_fork_inferior)
	(handle_vfork_child_exec_or_exit, do_target_resume)
	(check_curr_ui_sync_execution_done, handle_inferior_event_1)
	(handle_signal_stop, maybe_remove_breakpoints, normal_stop):
	Update.
	* inflow.c (child_terminal_init, info_terminal_command): Update.
	* infcmd.c (post_create_inferior, continue_1, prepare_one_step)
	(attach_command): Update.
	* infcall.c (call_thread_fsm_should_stop): Update.
	* gnu-nat.c (gnu_attach): Update.
	* extension.c (struct active_ext_lang_state)
	(restore_active_ext_lang): Update.
	* exceptions.c (print_flush): Update.
	* event-top.c (async_enable_stdin, default_quit_handler): Update.
	(struct quit_handler_cleanup_data, restore_quit_handler)
	(restore_quit_handler_dtor, make_cleanup_override_quit_handler):
	Remove.
	* cp-support.c (gdb_demangle): Update.
	* breakpoint.c (update_inserted_breakpoint_locations)
	(insert_breakpoint_locations, handle_jit_event)
	(disable_breakpoints_in_unloaded_shlib): Update.
	* annotate.c (annotate_breakpoints_invalid)
	(annotate_frames_invalid): Update.

gdb/gdbserver/ChangeLog
2017-09-20  Tom Tromey  <tom@tromey.com>

	* target.c (target_terminal::terminal_state): Define.
	(target_terminal::init): Rename from target_terminal_init.
	(target_terminal::inferior): Rename from
	target_terminal_inferior.
	(target_terminal::ours): Rename from target_terminal_ours.
	(target_terminal::ours_for_output, target_terminal::info): New.
This commit is contained in:
Tom Tromey 2017-09-19 21:56:36 -06:00
parent 013af3fc8e
commit 223ffa714c
28 changed files with 382 additions and 378 deletions

View File

@ -1,3 +1,74 @@
2017-09-20 Tom Tromey <tom@tromey.com>
* windows-nat.c (get_windows_debug_event, windows_wait)
(do_initial_windows_stuff, windows_attach): Update.
* utils.c (vwarning, internal_vproblem): Update.
(ui_unregister_input_event_handler_cleanup)
(prepare_to_handle_input): Remove.
(class scoped_input_handler): New.
(defaulted_query, prompt_for_continue): Update.
* tui/tui-hooks.c (tui_refresh_frame_and_register_information):
Update.
* top.c (undo_terminal_modifications_before_exit): Update.
* target/target.h (target_terminal_init, target_terminal_inferior)
(target_terminal_ours): Don't declare.
(class target_terminal): New.
* target.h (target_terminal_is_inferior, target_terminal_is_ours)
(target_terminal_ours_for_output)
(make_cleanup_restore_target_terminal): Don't declare.
(target_terminal_info): Remove.
* target.c (enum terminal_state, terminal_state): Remove.
(target_terminal::terminal_state): Define.
(target_terminal::init): Rename from target_terminal_init.
(target_terminal::inferior): Rename from
target_terminal_inferior.
(target_terminal::ours): Rename from target_terminal_ours.
(target_terminal::ours_for_output): Rename from
target_terminal_ours_for_output.
(target_terminal::info): New method.
(cleanup_restore_target_terminal)
(make_cleanup_restore_target_terminal): Remove.
* solib.c (handle_solib_event): Update.
* remote.c (remote_serial_quit_handler): Update.
(remote_terminal_inferior, remote_wait_as): Update.
* record-full.c (record_full_wait_1): Update.
* nto-procfs.c (procfs_create_inferior): Update.
* nat/fork-inferior.c (startup_inferior): Update.
* mi/mi-interp.c (mi_new_thread, mi_thread_exit)
(mi_record_changed, mi_inferior_added, mi_inferior_appeared)
(mi_inferior_exit, mi_inferior_removed, mi_traceframe_changed)
(mi_tsv_created, mi_tsv_deleted, mi_tsv_modified)
(mi_breakpoint_created, mi_breakpoint_deleted)
(mi_breakpoint_modified, mi_on_resume, mi_solib_loaded)
(mi_solib_unloaded, mi_command_param_changed, mi_memory_changed)
(mi_user_selected_context_changed, report_initial_inferior):
Update.
* linux-nat.c (linux_nat_attach, linux_nat_terminal_ours)
(linux_nat_terminal_inferior): Update.
* infrun.c (follow_fork_inferior)
(handle_vfork_child_exec_or_exit, do_target_resume)
(check_curr_ui_sync_execution_done, handle_inferior_event_1)
(handle_signal_stop, maybe_remove_breakpoints, normal_stop):
Update.
* inflow.c (child_terminal_init, info_terminal_command): Update.
* infcmd.c (post_create_inferior, continue_1, prepare_one_step)
(attach_command): Update.
* infcall.c (call_thread_fsm_should_stop): Update.
* gnu-nat.c (gnu_attach): Update.
* extension.c (struct active_ext_lang_state)
(restore_active_ext_lang): Update.
* exceptions.c (print_flush): Update.
* event-top.c (async_enable_stdin, default_quit_handler): Update.
(struct quit_handler_cleanup_data, restore_quit_handler)
(restore_quit_handler_dtor, make_cleanup_override_quit_handler):
Remove.
* cp-support.c (gdb_demangle): Update.
* breakpoint.c (update_inserted_breakpoint_locations)
(insert_breakpoint_locations, handle_jit_event)
(disable_breakpoints_in_unloaded_shlib): Update.
* annotate.c (annotate_breakpoints_invalid)
(annotate_frames_invalid): Update.
2017-09-20 Tom Tromey <tom@tromey.com>
* main.c (catch_command_errors): Rename from

View File

@ -63,14 +63,14 @@ annotate_breakpoints_invalid (void)
{
/* If the inferior owns the terminal (e.g., we're resuming),
make sure to leave with the inferior still owning it. */
int was_inferior = target_terminal_is_inferior ();
int was_inferior = target_terminal::is_inferior ();
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_unfiltered (("\n\032\032breakpoints-invalid\n"));
if (was_inferior)
target_terminal_inferior ();
target_terminal::inferior ();
breakpoints_invalid_emitted = 1;
}
@ -210,14 +210,14 @@ annotate_frames_invalid (void)
{
/* If the inferior owns the terminal (e.g., we're resuming),
make sure to leave with the inferior still owning it. */
int was_inferior = target_terminal_is_inferior ();
int was_inferior = target_terminal::is_inferior ();
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_unfiltered (("\n\032\032frames-invalid\n"));
if (was_inferior)
target_terminal_inferior ();
target_terminal::inferior ();
frames_invalid_emitted = 1;
}

View File

@ -3126,7 +3126,7 @@ update_inserted_breakpoint_locations (void)
if (error_flag)
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
error_stream (tmp_error_stream);
}
}
@ -3225,7 +3225,7 @@ insert_breakpoint_locations (void)
tmp_error_stream.printf ("Could not insert hardware breakpoints:\n\
You may have requested too many hardware breakpoints/watchpoints.\n");
}
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
error_stream (tmp_error_stream);
}
}
@ -5792,14 +5792,14 @@ handle_jit_event (void)
/* Switch terminal for any messages produced by
breakpoint_re_set. */
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
frame = get_current_frame ();
gdbarch = get_frame_arch (frame);
jit_event_handler (gdbarch);
target_terminal_inferior ();
target_terminal::inferior ();
}
/* Prepare WHAT final decision for infrun. */
@ -7925,7 +7925,7 @@ disable_breakpoints_in_unloaded_shlib (struct so_list *solib)
if (!disabled_shlib_breaks)
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
warning (_("Temporarily disabling breakpoints "
"for unloaded shared library \"%s\""),
solib->so_name);

View File

@ -1559,8 +1559,8 @@ gdb_demangle (const char *name, int options)
"demangler-warning", short_msg);
make_cleanup (xfree, long_msg);
make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
begin_line ();
if (core_dump_allowed)

View File

@ -548,7 +548,7 @@ async_enable_stdin (void)
if (ui->prompt_state == PROMPT_BLOCKED)
{
target_terminal_ours ();
target_terminal::ours ();
ui_register_input_event_handler (ui);
ui->prompt_state = PROMPT_NEEDED;
}
@ -957,7 +957,7 @@ default_quit_handler (void)
{
if (check_quit_flag ())
{
if (target_terminal_is_ours ())
if (target_terminal::is_ours ())
quit ();
else
target_pass_ctrlc ();
@ -967,51 +967,6 @@ default_quit_handler (void)
/* See defs.h. */
quit_handler_ftype *quit_handler = default_quit_handler;
/* Data for make_cleanup_override_quit_handler. Wrap the previous
handler pointer in a data struct because it's not portable to cast
a function pointer to a data pointer, which is what make_cleanup
expects. */
struct quit_handler_cleanup_data
{
/* The previous quit handler. */
quit_handler_ftype *prev_handler;
};
/* Cleanup call that restores the previous quit handler. */
static void
restore_quit_handler (void *arg)
{
struct quit_handler_cleanup_data *data
= (struct quit_handler_cleanup_data *) arg;
quit_handler = data->prev_handler;
}
/* Destructor for the quit handler cleanup. */
static void
restore_quit_handler_dtor (void *arg)
{
xfree (arg);
}
/* See defs.h. */
struct cleanup *
make_cleanup_override_quit_handler (quit_handler_ftype *new_quit_handler)
{
struct cleanup *old_chain;
struct quit_handler_cleanup_data *data;
data = XNEW (struct quit_handler_cleanup_data);
data->prev_handler = quit_handler;
old_chain = make_cleanup_dtor (restore_quit_handler, data,
restore_quit_handler_dtor);
quit_handler = new_quit_handler;
return old_chain;
}
/* Handle a SIGINT. */
void

View File

@ -27,21 +27,22 @@
#include "serial.h"
#include "gdbthread.h"
#include "top.h"
#include "common/gdb_optional.h"
static void
print_flush (void)
{
struct ui *ui = current_ui;
struct serial *gdb_stdout_serial;
struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
if (deprecated_error_begin_hook)
deprecated_error_begin_hook ();
gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
if (target_supports_terminal_ours ())
{
make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
term_state.emplace ();
target_terminal::ours_for_output ();
}
/* We want all output to appear now, before we print the error. We
@ -66,8 +67,6 @@ print_flush (void)
}
annotate_error_begin ();
do_cleanups (old_chain);
}
static void

View File

@ -750,7 +750,7 @@ set_active_ext_lang (const struct extension_language_defn *now_active)
previous->sigint_handler.handler_saved = 0;
active_ext_lang = now_active;
if (target_terminal_is_ours ())
if (target_terminal::is_ours ())
{
/* If the newly active extension language uses cooperative SIGINT
handling then ensure GDB's SIGINT handler is installed. */
@ -776,7 +776,7 @@ restore_active_ext_lang (struct active_ext_lang_state *previous)
{
active_ext_lang = previous->ext_lang;
if (target_terminal_is_ours ())
if (target_terminal::is_ours ())
{
/* Restore the previous SIGINT handler if one was saved. */
if (previous->sigint_handler.handler_saved)

View File

@ -1,3 +1,12 @@
2017-09-20 Tom Tromey <tom@tromey.com>
* target.c (target_terminal::terminal_state): Define.
(target_terminal::init): Rename from target_terminal_init.
(target_terminal::inferior): Rename from
target_terminal_inferior.
(target_terminal::ours): Rename from target_terminal_ours.
(target_terminal::ours_for_output, target_terminal::info): New.
2017-09-16 Simon Marchi <simon.marchi@ericsson.com>
* server.c (accumulate_file_name_length): Remove.

View File

@ -388,10 +388,15 @@ default_breakpoint_kind_from_pc (CORE_ADDR *pcptr)
return size;
}
/* Define it. */
enum target_terminal::terminal_state target_terminal::terminal_state
= target_terminal::terminal_is_ours;
/* See target/target.h. */
void
target_terminal_init ()
target_terminal::init ()
{
/* Placeholder needed because of fork_inferior. Not necessary on
GDBserver. */
@ -400,7 +405,7 @@ target_terminal_init ()
/* See target/target.h. */
void
target_terminal_inferior ()
target_terminal::inferior ()
{
/* Placeholder needed because of fork_inferior. Not necessary on
GDBserver. */
@ -409,8 +414,24 @@ target_terminal_inferior ()
/* See target/target.h. */
void
target_terminal_ours ()
target_terminal::ours ()
{
/* Placeholder needed because of fork_inferior. Not necessary on
GDBserver. */
}
/* See target/target.h. */
void
target_terminal::ours_for_output (void)
{
/* Placeholder. */
}
/* See target/target.h. */
void
target_terminal::info (const char *arg, int from_tty)
{
/* Placeholder. */
}

View File

@ -2230,7 +2230,7 @@ gnu_attach (struct target_ops *ops, const char *args, int from_tty)
/* We have to initialize the terminal settings now, since the code
below might try to restore them. */
target_terminal_init ();
target_terminal::init ();
/* If the process was stopped before we attached, make it continue the next
time the user does a continue. */

View File

@ -544,7 +544,7 @@ call_thread_fsm_should_stop (struct thread_fsm *self,
/* Break out of wait_sync_command_done. */
scoped_restore save_ui = make_scoped_restore (&current_ui, f->waiting_ui);
target_terminal_ours ();
target_terminal::ours ();
f->waiting_ui->prompt_state = PROMPT_NEEDED;
}

View File

@ -411,7 +411,7 @@ post_create_inferior (struct target_ops *target, int from_tty)
{
/* Be sure we own the terminal in case write operations are performed. */
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
/* If the target hasn't taken care of this already, do it now.
Targets which need to access registers during to_open,
@ -783,7 +783,7 @@ continue_1 (int all_threads)
Continuing.
<no thread was resumed, but the inferior now owns the terminal>
*/
target_terminal_inferior ();
target_terminal::inferior ();
}
}
else
@ -1172,7 +1172,7 @@ prepare_one_step (struct step_command_fsm *sm)
&tp->control.step_range_end) == 0)
error (_("Cannot find bounds of current function"));
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_filtered (_("Single stepping until exit from function %s,"
"\nwhich has no line number information.\n"),
name);
@ -2839,7 +2839,7 @@ attach_command (char *args, int from_tty)
/* Set up the "saved terminal modes" of the inferior
based on what modes we are starting it with. */
target_terminal_init ();
target_terminal::init ();
/* Install inferior's terminal modes. This may look like a no-op,
as we've just saved them above, however, this does more than
@ -2855,7 +2855,7 @@ attach_command (char *args, int from_tty)
while we're in the event loop waiting for that stop. That is,
before the attach continuation runs and the command is really
finished. */
target_terminal_inferior ();
target_terminal::inferior ();
/* Set up execution context to know that we should return from
wait_for_inferior as soon as the target reports a stop. */

View File

@ -226,7 +226,7 @@ child_terminal_init (struct target_ops *self)
{
#ifdef PROCESS_GROUP_TYPE
/* This is for Lynx, and should be cleaned up by having Lynx be a
separate debugging target with a version of target_terminal_init
separate debugging target with a version of target_terminal::init
which passes in the process group to a generic routine which does
all the work (and the non-threaded child_terminal_init can just
pass in inferior_ptid to the same routine). */
@ -536,7 +536,7 @@ copy_terminal_info (struct inferior *to, struct inferior *from)
void
info_terminal_command (char *arg, int from_tty)
{
target_terminal_info (arg, from_tty);
target_terminal::info (arg, from_tty);
}
void

View File

@ -478,7 +478,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
/* Ensure that we have a process ptid. */
ptid_t process_ptid = pid_to_ptid (ptid_get_pid (child_ptid));
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
fprintf_filtered (gdb_stdlog,
_("Detaching after %s from child %s.\n"),
has_vforked ? "vfork" : "fork",
@ -563,7 +563,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
if (info_verbose || debug_infrun)
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
fprintf_filtered (gdb_stdlog,
_("Attaching after %s %s to child %s.\n"),
target_pid_to_str (parent_ptid),
@ -611,7 +611,7 @@ holding the child stopped. Try \"set detach-on-fork\" or \
/* Ensure that we have a process ptid. */
ptid_t process_ptid = pid_to_ptid (ptid_get_pid (child_ptid));
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
fprintf_filtered (gdb_stdlog,
_("Detaching after fork from "
"child %s.\n"),
@ -970,7 +970,7 @@ handle_vfork_child_exec_or_exit (int exec)
if (debug_infrun || info_verbose)
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
if (exec)
{
@ -2339,7 +2339,7 @@ do_target_resume (ptid_t resume_ptid, int step, enum gdb_signal sig)
gdb_assert (!tp->stop_requested);
/* Install inferior's terminal modes. */
target_terminal_inferior ();
target_terminal::inferior ();
/* Avoid confusing the next resume, if the next stop/resume
happens to apply to another thread. */
@ -3818,7 +3818,7 @@ check_curr_ui_sync_execution_done (void)
&& ui->async
&& !gdb_in_secondary_prompt_p (ui))
{
target_terminal_ours ();
target_terminal::ours ();
observer_notify_sync_execution_done ();
ui_register_input_event_handler (ui);
}
@ -5056,7 +5056,7 @@ handle_inferior_event_1 (struct execution_control_state *ecs)
set_current_inferior (find_inferior_ptid (ecs->ptid));
set_current_program_space (current_inferior ()->pspace);
handle_vfork_child_exec_or_exit (0);
target_terminal_ours (); /* Must do this before mourn anyway. */
target_terminal::ours (); /* Must do this before mourn anyway. */
/* Clearing any previous state of convenience variables. */
clear_exit_convenience_vars ();
@ -6098,9 +6098,9 @@ handle_signal_stop (struct execution_control_state *ecs)
if (signal_print[ecs->event_thread->suspend.stop_signal])
{
/* The signal table tells us to print about this signal. */
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
observer_notify_signal_received (ecs->event_thread->suspend.stop_signal);
target_terminal_inferior ();
target_terminal::inferior ();
}
/* Clear the signal if it should not be passed. */
@ -8084,7 +8084,7 @@ maybe_remove_breakpoints (void)
{
if (remove_breakpoints ())
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_filtered (_("Cannot remove breakpoints because "
"program is no longer writable.\nFurther "
"execution is probably impossible.\n"));
@ -8241,7 +8241,7 @@ normal_stop (void)
{
SWITCH_THRU_ALL_UIS ()
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_filtered (_("[Switching to %s]\n"),
target_pid_to_str (inferior_ptid));
annotate_thread_changed ();
@ -8254,7 +8254,7 @@ normal_stop (void)
SWITCH_THRU_ALL_UIS ()
if (current_ui->prompt_state == PROMPT_BLOCKED)
{
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_filtered (_("No unwaited-for children left.\n"));
}
}

View File

@ -1251,7 +1251,7 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty)
{
int exit_code = WEXITSTATUS (status);
target_terminal_ours ();
target_terminal::ours ();
target_mourn_inferior (inferior_ptid);
if (exit_code == 0)
error (_("Unable to attach: program exited normally."));
@ -1263,7 +1263,7 @@ linux_nat_attach (struct target_ops *ops, const char *args, int from_tty)
{
enum gdb_signal signo;
target_terminal_ours ();
target_terminal::ours ();
target_mourn_inferior (inferior_ptid);
signo = gdb_signal_from_host (WTERMSIG (status));
@ -4458,13 +4458,13 @@ linux_nat_terminal_inferior (struct target_ops *self)
set_sigint_trap ();
}
/* target_terminal_ours implementation.
/* target_terminal::ours implementation.
This is a wrapper around child_terminal_ours to add async support (and
implement the target_terminal_ours vs target_terminal_ours_for_output
implement the target_terminal::ours vs target_terminal::ours_for_output
distinction). child_terminal_ours is currently no different than
child_terminal_ours_for_output.
We leave target_terminal_ours_for_output alone, leaving it to
We leave target_terminal::ours_for_output alone, leaving it to
child_terminal_ours_for_output. */
static void

View File

@ -341,20 +341,17 @@ mi_new_thread (struct thread_info *t)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"thread-created,id=\"%d\",group-id=\"i%d\"",
t->global_num, inf->num);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -367,19 +364,16 @@ mi_thread_exit (struct thread_info *t, int silent)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"thread-exited,id=\"%d\",group-id=\"i%d\"",
t->global_num, t->inf->num);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -392,13 +386,12 @@ mi_record_changed (struct inferior *inferior, int started, const char *method,
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (started)
{
@ -425,8 +418,6 @@ mi_record_changed (struct inferior *inferior, int started, const char *method,
}
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -437,7 +428,6 @@ mi_inferior_added (struct inferior *inf)
{
struct interp *interp;
struct mi_interp *mi;
struct cleanup *old_chain;
/* We'll be called once for the initial inferior, before the top
level interpreter is set. */
@ -449,15 +439,13 @@ mi_inferior_added (struct inferior *inf)
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"thread-group-added,id=\"i%d\"",
inf->num);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -467,19 +455,17 @@ mi_inferior_appeared (struct inferior *inf)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"thread-group-started,id=\"i%d\",pid=\"%d\"",
inf->num, inf->pid);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -489,13 +475,12 @@ mi_inferior_exit (struct inferior *inf)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (inf->has_exit_code)
fprintf_unfiltered (mi->event_channel,
@ -506,7 +491,6 @@ mi_inferior_exit (struct inferior *inf)
"thread-group-exited,id=\"i%d\"", inf->num);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -516,20 +500,17 @@ mi_inferior_removed (struct inferior *inf)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"thread-group-removed,id=\"i%d\"",
inf->num);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -746,13 +727,12 @@ mi_traceframe_changed (int tfnum, int tpnum)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (tfnum >= 0)
fprintf_unfiltered (mi->event_channel, "traceframe-changed,"
@ -762,8 +742,6 @@ mi_traceframe_changed (int tfnum, int tpnum)
fprintf_unfiltered (mi->event_channel, "traceframe-changed,end");
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -775,21 +753,18 @@ mi_tsv_created (const struct trace_state_variable *tsv)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel, "tsv-created,"
"name=\"%s\",initial=\"%s\"\n",
tsv->name, plongest (tsv->initial_value));
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -801,13 +776,12 @@ mi_tsv_deleted (const struct trace_state_variable *tsv)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (tsv != NULL)
fprintf_unfiltered (mi->event_channel, "tsv-deleted,"
@ -816,8 +790,6 @@ mi_tsv_deleted (const struct trace_state_variable *tsv)
fprintf_unfiltered (mi->event_channel, "tsv-deleted\n");
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -830,15 +802,14 @@ mi_tsv_modified (const struct trace_state_variable *tsv)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *mi_uiout;
struct cleanup *old_chain;
if (mi == NULL)
continue;
mi_uiout = interp_ui_out (top_level_interpreter ());
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"tsv-modified");
@ -854,8 +825,6 @@ mi_tsv_modified (const struct trace_state_variable *tsv)
mi_uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -874,15 +843,14 @@ mi_breakpoint_created (struct breakpoint *b)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *mi_uiout;
struct cleanup *old_chain;
if (mi == NULL)
continue;
mi_uiout = interp_ui_out (top_level_interpreter ());
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"breakpoint-created");
@ -906,8 +874,6 @@ mi_breakpoint_created (struct breakpoint *b)
mi_uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -925,20 +891,17 @@ mi_breakpoint_deleted (struct breakpoint *b)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel, "breakpoint-deleted,id=\"%d\"",
b->number);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -956,13 +919,12 @@ mi_breakpoint_modified (struct breakpoint *b)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"breakpoint-modified");
/* We want the output from gdb_breakpoint_query to go to
@ -985,8 +947,6 @@ mi_breakpoint_modified (struct breakpoint *b)
mi->mi_uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -1094,17 +1054,14 @@ mi_on_resume (ptid_t ptid)
SWITCH_THRU_ALL_UIS ()
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct cleanup *old_chain;
if (mi == NULL)
continue;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
mi_on_resume_1 (mi, ptid);
do_cleanups (old_chain);
}
}
@ -1138,15 +1095,14 @@ mi_solib_loaded (struct so_list *solib)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *uiout;
struct cleanup *old_chain;
if (mi == NULL)
continue;
uiout = interp_ui_out (top_level_interpreter ());
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel, "library-loaded");
@ -1157,8 +1113,6 @@ mi_solib_loaded (struct so_list *solib)
uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -1169,15 +1123,14 @@ mi_solib_unloaded (struct so_list *solib)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *uiout;
struct cleanup *old_chain;
if (mi == NULL)
continue;
uiout = interp_ui_out (top_level_interpreter ());
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel, "library-unloaded");
@ -1194,8 +1147,6 @@ mi_solib_unloaded (struct so_list *solib)
uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -1211,15 +1162,14 @@ mi_command_param_changed (const char *param, const char *value)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *mi_uiout;
struct cleanup *old_chain;
if (mi == NULL)
continue;
mi_uiout = interp_ui_out (top_level_interpreter ());
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel, "cmd-param-changed");
@ -1231,8 +1181,6 @@ mi_command_param_changed (const char *param, const char *value)
mi_uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -1250,15 +1198,14 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *mi_uiout;
struct obj_section *sec;
struct cleanup *old_chain;
if (mi == NULL)
continue;
mi_uiout = interp_ui_out (top_level_interpreter ());
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel, "memory-changed");
@ -1283,8 +1230,6 @@ mi_memory_changed (struct inferior *inferior, CORE_ADDR memaddr,
mi_uiout->redirect (NULL);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -1306,7 +1251,6 @@ mi_user_selected_context_changed (user_selected_what selection)
{
struct mi_interp *mi = as_mi_interp (top_level_interpreter ());
struct ui_out *mi_uiout;
struct cleanup *old_chain;
if (mi == NULL)
continue;
@ -1316,8 +1260,8 @@ mi_user_selected_context_changed (user_selected_what selection)
mi_uiout->redirect (mi->event_channel);
ui_out_redirect_pop redirect_popper (mi_uiout);
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
if (selection & USER_SELECTED_INFERIOR)
print_selected_inferior (mi->cli_uiout);
@ -1340,7 +1284,6 @@ mi_user_selected_context_changed (user_selected_what selection)
}
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
}
}
@ -1352,17 +1295,15 @@ report_initial_inferior (struct inferior *inf, void *closure)
and top_level_interpreter_data is set, we cannot call
it here. */
struct mi_interp *mi = (struct mi_interp *) closure;
struct cleanup *old_chain;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fprintf_unfiltered (mi->event_channel,
"thread-group-added,id=\"i%d\"",
inf->num);
gdb_flush (mi->event_channel);
do_cleanups (old_chain);
return 0;
}

View File

@ -502,7 +502,7 @@ startup_inferior (pid_t pid, int ntraps,
break;
case TARGET_WAITKIND_SIGNALLED:
target_terminal_ours ();
target_terminal::ours ();
target_mourn_inferior (event_ptid);
error (_("During startup program terminated with signal %s, %s."),
gdb_signal_to_name (ws.value.sig),
@ -510,7 +510,7 @@ startup_inferior (pid_t pid, int ntraps,
return resume_ptid;
case TARGET_WAITKIND_EXITED:
target_terminal_ours ();
target_terminal::ours ();
target_mourn_inferior (event_ptid);
if (ws.value.integer)
error (_("During startup program exited with code %d."),
@ -549,10 +549,10 @@ startup_inferior (pid_t pid, int ntraps,
/* Set up the "saved terminal modes" of the inferior
based on what modes we are starting it with. */
target_terminal_init ();
target_terminal::init ();
/* Install inferior's terminal modes. */
target_terminal_inferior ();
target_terminal::inferior ();
terminal_initted = 1;
}

View File

@ -1285,7 +1285,7 @@ procfs_create_inferior (struct target_ops *ops, const char *exec_file,
}
if (!target_is_pushed (ops))
push_target (ops);
target_terminal_init ();
target_terminal::init ();
if (exec_bfd != NULL
|| (symfile_objfile != NULL && symfile_objfile->obfd != NULL))

View File

@ -1218,7 +1218,7 @@ record_full_wait_1 (struct target_ops *ops,
And in GDB replay mode, GDB doesn't need to be in terminal_inferior
mode, because inferior will not executed.
Then set it to terminal_ours to make GDB get the signal. */
target_terminal_ours ();
target_terminal::ours ();
/* In EXEC_FORWARD mode, record_full_list points to the tail of prev
instruction. */

View File

@ -4933,7 +4933,7 @@ remote_query_supported (void)
instead.
- The target has been resumed in the foreground
(target_terminal_is_ours is false) with a synchronous resume
(target_terminal::is_ours is false) with a synchronous resume
packet, and we're blocked waiting for the stop reply, thus a
Ctrl-C should be immediately sent to the target.
@ -4964,11 +4964,11 @@ remote_serial_quit_handler (void)
remote_unpush_and_throw ();
}
/* If ^C has already been sent once, offer to disconnect. */
else if (!target_terminal_is_ours () && rs->ctrlc_pending_p)
else if (!target_terminal::is_ours () && rs->ctrlc_pending_p)
interrupt_query ();
/* All-stop protocol, and blocked waiting for stop reply. Send
an interrupt request. */
else if (!target_terminal_is_ours () && rs->waiting_for_stop_reply)
else if (!target_terminal::is_ours () && rs->waiting_for_stop_reply)
target_interrupt (inferior_ptid);
else
rs->got_ctrlc_during_io = 1;
@ -6280,7 +6280,7 @@ interrupt_query (void)
static void
remote_terminal_inferior (struct target_ops *self)
{
/* FIXME: cagney/1999-09-27: Make calls to target_terminal_*()
/* FIXME: cagney/1999-09-27: Make calls to target_terminal::*()
idempotent. The event-loop GDB talking to an asynchronous target
with a synchronous command calls this function from both
event-top.c and infrun.c/infcmd.c. Once GDB stops trying to
@ -7412,12 +7412,12 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
{
/* Zero length reply means that we tried 'S' or 'C' and the
remote system doesn't support it. */
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
printf_filtered
("Can't send signals to this remote system. %s not sent.\n",
gdb_signal_to_name (rs->last_sent_signal));
rs->last_sent_signal = GDB_SIGNAL_0;
target_terminal_inferior ();
target_terminal::inferior ();
strcpy (buf, rs->last_sent_step ? "s" : "c");
putpkt (buf);

View File

@ -1285,9 +1285,9 @@ handle_solib_event (void)
/* Check for any newly added shared libraries if we're supposed to
be adding them automatically. Switch terminal for any messages
produced by breakpoint_re_set. */
target_terminal_ours_for_output ();
target_terminal::ours_for_output ();
solib_add (NULL, 0, auto_solib_add);
target_terminal_inferior ();
target_terminal::inferior ();
}
/* Reload shared libraries, but avoid reloading the same symbol file

View File

@ -433,53 +433,25 @@ target_load (const char *arg, int from_tty)
(*current_target.to_load) (&current_target, arg, from_tty);
}
/* Possible terminal states. */
/* Define it. */
enum terminal_state
{
/* The inferior's terminal settings are in effect. */
terminal_is_inferior = 0,
enum target_terminal::terminal_state target_terminal::terminal_state
= target_terminal::terminal_is_ours;
/* Some of our terminal settings are in effect, enough to get
proper output. */
terminal_is_ours_for_output = 1,
/* Our terminal settings are in effect, for output and input. */
terminal_is_ours = 2
};
static enum terminal_state terminal_state = terminal_is_ours;
/* See target.h. */
/* See target/target.h. */
void
target_terminal_init (void)
target_terminal::init (void)
{
(*current_target.to_terminal_init) (&current_target);
terminal_state = terminal_is_ours;
}
/* See target.h. */
int
target_terminal_is_inferior (void)
{
return (terminal_state == terminal_is_inferior);
}
/* See target.h. */
int
target_terminal_is_ours (void)
{
return (terminal_state == terminal_is_ours);
}
/* See target.h. */
/* See target/target.h. */
void
target_terminal_inferior (void)
target_terminal::inferior (void)
{
struct ui *ui = current_ui;
@ -490,8 +462,8 @@ target_terminal_inferior (void)
/* Since we always run the inferior in the main console (unless "set
inferior-tty" is in effect), when some UI other than the main one
calls target_terminal_inferior/target_terminal_inferior, then we
leave the main UI's terminal settings as is. */
calls target_terminal::inferior, then we leave the main UI's
terminal settings as is. */
if (ui != main_ui)
return;
@ -509,14 +481,14 @@ target_terminal_inferior (void)
target_pass_ctrlc ();
}
/* See target.h. */
/* See target/target.h. */
void
target_terminal_ours (void)
target_terminal::ours ()
{
struct ui *ui = current_ui;
/* See target_terminal_inferior. */
/* See target_terminal::inferior. */
if (ui != main_ui)
return;
@ -527,14 +499,14 @@ target_terminal_ours (void)
terminal_state = terminal_is_ours;
}
/* See target.h. */
/* See target/target.h. */
void
target_terminal_ours_for_output (void)
target_terminal::ours_for_output ()
{
struct ui *ui = current_ui;
/* See target_terminal_inferior. */
/* See target_terminal::inferior. */
if (ui != main_ui)
return;
@ -544,6 +516,14 @@ target_terminal_ours_for_output (void)
terminal_state = terminal_is_ours_for_output;
}
/* See target/target.h. */
void
target_terminal::info (const char *arg, int from_tty)
{
(*current_target.to_terminal_info) (&current_target, arg, from_tty);
}
/* See target.h. */
int
@ -561,40 +541,6 @@ target_supports_terminal_ours (void)
return 0;
}
/* Restore the terminal to its previous state (helper for
make_cleanup_restore_target_terminal). */
static void
cleanup_restore_target_terminal (void *arg)
{
enum terminal_state *previous_state = (enum terminal_state *) arg;
switch (*previous_state)
{
case terminal_is_ours:
target_terminal_ours ();
break;
case terminal_is_ours_for_output:
target_terminal_ours_for_output ();
break;
case terminal_is_inferior:
target_terminal_inferior ();
break;
}
}
/* See target.h. */
struct cleanup *
make_cleanup_restore_target_terminal (void)
{
enum terminal_state *ts = XNEW (enum terminal_state);
*ts = terminal_state;
return make_cleanup_dtor (cleanup_restore_target_terminal, ts, xfree);
}
static void
tcomplain (void)
{

View File

@ -1533,41 +1533,11 @@ extern int target_remove_breakpoint (struct gdbarch *gdbarch,
struct bp_target_info *bp_tgt,
enum remove_bp_reason reason);
/* Returns true if the terminal settings of the inferior are in
effect. */
extern int target_terminal_is_inferior (void);
/* Returns true if our terminal settings are in effect. */
extern int target_terminal_is_ours (void);
/* For target_terminal_init, target_terminal_inferior and
target_terminal_ours, see target/target.h. */
/* Put some of our terminal settings into effect, enough to get proper
results from our output, but do not change into or out of RAW mode
so that no input is discarded. This is a no-op if terminal_ours
was most recently called. This is a no-op unless called with the main
UI as current UI. */
extern void target_terminal_ours_for_output (void);
/* Return true if the target stack has a non-default
"to_terminal_ours" method. */
extern int target_supports_terminal_ours (void);
/* Make a cleanup that restores the state of the terminal to the current
state. */
extern struct cleanup *make_cleanup_restore_target_terminal (void);
/* Print useful information about our terminal status, if such a thing
exists. */
#define target_terminal_info(arg, from_tty) \
(*current_target.to_terminal_info) (&current_target, arg, from_tty)
/* Kill the inferior process. Make it go away. */
extern void target_kill (void);

View File

@ -95,18 +95,109 @@ extern void target_mourn_inferior (ptid_t ptid);
extern int target_supports_multi_process (void);
/* Initialize the terminal settings we record for the inferior,
before we actually run the inferior. */
extern void target_terminal_init ();
/* Represents the state of the target terminal. */
class target_terminal
{
public:
/* Put the inferior's terminal settings into effect. This is
preparation for starting or resuming the inferior. This is a no-op
unless called with the main UI as current UI. */
extern void target_terminal_inferior ();
target_terminal () = delete;
~target_terminal () = delete;
DISABLE_COPY_AND_ASSIGN (target_terminal);
/* Put our terminal settings into effect. First record the inferior's
terminal settings so they can be restored properly later. This is
a no-op unless called with the main UI as current UI. */
extern void target_terminal_ours ();
/* Initialize the terminal settings we record for the inferior,
before we actually run the inferior. */
static void init ();
/* Put the inferior's terminal settings into effect. This is
preparation for starting or resuming the inferior. This is a no-op
unless called with the main UI as current UI. */
static void inferior ();
/* Put our terminal settings into effect. First record the inferior's
terminal settings so they can be restored properly later. This is
a no-op unless called with the main UI as current UI. */
static void ours ();
/* Put some of our terminal settings into effect, enough to get proper
results from our output, but do not change into or out of RAW mode
so that no input is discarded. This is a no-op if terminal_ours
was most recently called. This is a no-op unless called with the main
UI as current UI. */
static void ours_for_output ();
/* Returns true if the terminal settings of the inferior are in
effect. */
static bool is_inferior ()
{
return terminal_state == terminal_is_inferior;
}
/* Returns true if our terminal settings are in effect. */
static bool is_ours ()
{
return terminal_state == terminal_is_ours;
}
/* Print useful information about our terminal status, if such a thing
exists. */
static void info (const char *arg, int from_tty);
private:
/* Possible terminal states. */
enum terminal_state
{
/* The inferior's terminal settings are in effect. */
terminal_is_inferior = 0,
/* Some of our terminal settings are in effect, enough to get
proper output. */
terminal_is_ours_for_output = 1,
/* Our terminal settings are in effect, for output and input. */
terminal_is_ours = 2
};
public:
/* A class that restores the state of the terminal to the current
state. */
class scoped_restore_terminal_state
{
public:
scoped_restore_terminal_state ()
: m_state (terminal_state)
{
}
~scoped_restore_terminal_state ()
{
switch (m_state)
{
case terminal_is_ours:
ours ();
break;
case terminal_is_ours_for_output:
ours_for_output ();
break;
case terminal_is_inferior:
inferior ();
break;
}
}
DISABLE_COPY_AND_ASSIGN (scoped_restore_terminal_state);
private:
target_terminal::terminal_state m_state;
};
private:
static terminal_state terminal_state;
};
#endif /* TARGET_COMMON_H */

View File

@ -1571,7 +1571,7 @@ undo_terminal_modifications_before_exit (void)
{
struct ui *saved_top_level = current_ui;
target_terminal_ours ();
target_terminal::ours ();
current_ui = main_ui;

View File

@ -118,14 +118,13 @@ tui_refresh_frame_and_register_information (int registers_too_p)
{
struct frame_info *fi;
CORE_ADDR pc;
struct cleanup *old_chain;
int frame_info_changed_p;
if (!has_stack_frames ())
return;
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
fi = get_selected_frame (NULL);
/* Ensure that symbols for this frame are read in. Also, determine
@ -156,8 +155,6 @@ tui_refresh_frame_and_register_information (int registers_too_p)
tui_check_data_values (fi);
tui_refreshing_registers = 0;
}
do_cleanups (old_chain);
}
/* Dummy callback for deprecated_print_frame_info_listing_hook which is called

View File

@ -67,6 +67,7 @@
#include "gdb_regex.h"
#include "job-control.h"
#include "common/selftest.h"
#include "common/gdb_optional.h"
#if !HAVE_DECL_MALLOC
extern PTR malloc (); /* ARI: PTR */
@ -276,12 +277,11 @@ vwarning (const char *string, va_list args)
(*deprecated_warning_hook) (string, args);
else
{
struct cleanup *old_chain = make_cleanup (null_cleanup, NULL);
gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
if (target_supports_terminal_ours ())
{
make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
term_state.emplace ();
target_terminal::ours_for_output ();
}
if (filtered_printing_initialized ())
wrap_here (""); /* Force out any buffered output. */
@ -290,8 +290,6 @@ vwarning (const char *string, va_list args)
fputs_unfiltered (warning_pre_print, gdb_stderr);
vfprintf_unfiltered (gdb_stderr, string, args);
fprintf_unfiltered (gdb_stderr, "\n");
do_cleanups (old_chain);
}
}
@ -485,10 +483,11 @@ internal_vproblem (struct internal_problem *problem,
}
/* Try to get the message out and at the start of a new line. */
gdb::optional<target_terminal::scoped_restore_terminal_state> term_state;
if (target_supports_terminal_ours ())
{
make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
term_state.emplace ();
target_terminal::ours_for_output ();
}
if (filtered_printing_initialized ())
begin_line ();
@ -897,32 +896,43 @@ make_hex_string (const gdb_byte *data, size_t length)
/* A cleanup that simply calls ui_unregister_input_event_handler. */
/* An RAII class that sets up to handle input and then tears down
during destruction. */
static void
ui_unregister_input_event_handler_cleanup (void *ui)
class scoped_input_handler
{
ui_unregister_input_event_handler ((struct ui *) ui);
}
public:
/* Set up to handle input. */
scoped_input_handler ()
: m_quit_handler (make_scoped_restore (&quit_handler,
default_quit_handler)),
m_ui (NULL)
{
target_terminal::ours ();
ui_register_input_event_handler (current_ui);
if (current_ui->prompt_state == PROMPT_BLOCKED)
m_ui = current_ui;
}
static struct cleanup *
prepare_to_handle_input (void)
{
struct cleanup *old_chain;
~scoped_input_handler ()
{
if (m_ui != NULL)
ui_unregister_input_event_handler (m_ui);
}
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours ();
DISABLE_COPY_AND_ASSIGN (scoped_input_handler);
ui_register_input_event_handler (current_ui);
if (current_ui->prompt_state == PROMPT_BLOCKED)
make_cleanup (ui_unregister_input_event_handler_cleanup, current_ui);
private:
make_cleanup_override_quit_handler (default_quit_handler);
/* Save and restore the terminal state. */
target_terminal::scoped_restore_terminal_state m_term_state;
return old_chain;
}
/* Save and restore the quit handler. */
scoped_restore m_quit_handler;
/* The saved UI, if non-NULL. */
struct ui *m_ui;
};
@ -987,9 +997,8 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
/* Restrict queries to the main UI. */
|| current_ui != main_ui)
{
old_chain = make_cleanup_restore_target_terminal ();
target_terminal_ours_for_output ();
target_terminal::scoped_restore_terminal_state term_state;
target_terminal::ours_for_output ();
wrap_here ("");
vfprintf_filtered (gdb_stdout, ctlstr, args);
@ -998,18 +1007,13 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
y_string, n_string, def_answer);
gdb_flush (gdb_stdout);
do_cleanups (old_chain);
return def_value;
}
if (deprecated_query_hook)
{
int res;
old_chain = make_cleanup_restore_target_terminal ();
res = deprecated_query_hook (ctlstr, args);
do_cleanups (old_chain);
return res;
target_terminal::scoped_restore_terminal_state term_state;
return deprecated_query_hook (ctlstr, args);
}
/* Format the question outside of the loop, to avoid reusing args. */
@ -1026,7 +1030,7 @@ defaulted_query (const char *ctlstr, const char defchar, va_list args)
using namespace std::chrono;
steady_clock::time_point prompt_started = steady_clock::now ();
prepare_to_handle_input ();
scoped_input_handler prepare_input;
while (1)
{
@ -1590,7 +1594,7 @@ prompt_for_continue (void)
beyond the end of the screen. */
reinitialize_more_filter ();
prepare_to_handle_input ();
scoped_input_handler prepare_input;
/* Call gdb_readline_wrapper, not readline, in order to keep an
event loop running. */

View File

@ -1519,7 +1519,7 @@ get_windows_debug_event (struct target_ops *ops,
"EXIT_PROCESS_DEBUG_EVENT"));
if (!windows_initialization_done)
{
target_terminal_ours ();
target_terminal::ours ();
target_mourn_inferior (inferior_ptid);
error (_("During startup program exited with code 0x%x."),
(unsigned int) current_event.u.ExitProcess.dwExitCode);
@ -1626,7 +1626,7 @@ windows_wait (struct target_ops *ops,
{
int pid = -1;
target_terminal_ours ();
target_terminal::ours ();
/* We loop when we get a non-standard exception rather than return
with a SPURIOUS because resume can try and step or modify things,
@ -1771,8 +1771,8 @@ do_initial_windows_stuff (struct target_ops *ops, DWORD pid, int attaching)
current thread until we report an event out of windows_wait. */
inferior_ptid = pid_to_ptid (pid);
target_terminal_init ();
target_terminal_inferior ();
target_terminal::init ();
target_terminal::inferior ();
windows_initialization_done = 0;
@ -1912,7 +1912,7 @@ windows_attach (struct target_ops *ops, const char *args, int from_tty)
}
do_initial_windows_stuff (ops, pid, 1);
target_terminal_ours ();
target_terminal::ours ();
}
static void