aboutsummaryrefslogtreecommitdiff
path: root/gdb/top.h
diff options
context:
space:
mode:
authorTom Tromey <tom@tromey.com>2016-09-24 16:11:14 -0600
committerTom Tromey <tom@tromey.com>2016-10-21 14:17:34 -0600
commit0e454242cc1527e49ad0ea795614ac94a083b68a (patch)
tree496037f8b3077158d566d6506b6ac642bbb40281 /gdb/top.h
parent8dddcb8f005e8470312bf33041bb6ddaa5084e32 (diff)
downloadgdb-0e454242cc1527e49ad0ea795614ac94a083b68a.zip
gdb-0e454242cc1527e49ad0ea795614ac94a083b68a.tar.gz
gdb-0e454242cc1527e49ad0ea795614ac94a083b68a.tar.bz2
Remove make_cleanup_restore_current_ui
This removes make_cleanup_restore_current_ui by converting the last use. The last use was in a few functions used to iterate over all UIs. This patch replaces these functions with a class, and arranges for the class destructor to do the needed cleanup. 2016-10-21 Tom Tromey <tom@tromey.com> * tui/tui-interp.c (tui_on_normal_stop, tui_on_signal_received) (tui_on_end_stepping_range, tui_on_signal_exited, tui_on_exited) (tui_on_no_history, tui_on_user_selected_context_changed): Update. * top.h (switch_thru_all_uis): New class. (SWITCH_THRU_ALL_UIS): Rewrite. (make_cleanup_restore_current_ui, switch_thru_all_uis_init) (switch_thru_all_uis_cond, switch_thru_all_uis_next): Don't declare. * 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_on_signal_received) (mi_on_end_stepping_range, mi_on_signal_exited, mi_on_exited) (mi_on_no_history, mi_on_normal_stop, mi_traceframe_changed) (mi_tsv_created, mi_tsv_deleted, mi_tsv_modified) (mi_breakpoint_created, mi_breakpoint_deleted) (mi_breakpoint_modified, mi_output_running_pid, mi_on_resume) (mi_solib_loaded, mi_solib_unloaded, mi_command_param_changed) (mi_memory_changed, mi_user_selected_context_changed): Update. * infrun.c (all_uis_check_sync_execution_done) (all_uis_on_sync_execution_starting, normal_stop): Update. * event-top.c (restore_ui_cleanup) (make_cleanup_restore_current_ui, switch_thru_all_uis_init) (switch_thru_all_uis_cond, switch_thru_all_uis_next): Remove. * cli/cli-interp.c (cli_on_normal_stop, cli_on_signal_received) (cli_on_end_stepping_range, cli_on_signal_exited, cli_on_exited) (cli_on_no_history, cli_on_user_selected_context_changed): Update. * breakpoint.c (watchpoint_check): Update.
Diffstat (limited to 'gdb/top.h')
-rw-r--r--gdb/top.h57
1 files changed, 38 insertions, 19 deletions
diff --git a/gdb/top.h b/gdb/top.h
index acdb8e9..482ed3e 100644
--- a/gdb/top.h
+++ b/gdb/top.h
@@ -155,27 +155,49 @@ extern struct ui *current_ui;
/* The list of all UIs. */
extern struct ui *ui_list;
-/* State for SWITCH_THRU_ALL_UIS. Declared here because it is meant
- to be created on the stack, but should be treated as opaque. */
-struct switch_thru_all_uis
+/* State for SWITCH_THRU_ALL_UIS. */
+class switch_thru_all_uis
{
- struct ui *iter;
- struct cleanup *old_chain;
+public:
+
+ switch_thru_all_uis () : m_iter (ui_list), m_save_ui (&current_ui)
+ {
+ current_ui = ui_list;
+ }
+
+ /* If done iterating, return true; otherwise return false. */
+ bool done () const
+ {
+ return m_iter == NULL;
+ }
+
+ /* Move to the next UI, setting current_ui if iteration is not yet
+ complete. */
+ void next ()
+ {
+ m_iter = m_iter->next;
+ if (m_iter != NULL)
+ current_ui = m_iter;
+ }
+
+ private:
+
+ /* No need for these. They are intentionally not defined
+ anywhere. */
+ switch_thru_all_uis &operator= (const switch_thru_all_uis &);
+ switch_thru_all_uis (const switch_thru_all_uis &);
+
+ /* Used to iterate through the UIs. */
+ struct ui *m_iter;
+
+ /* Save and restore current_ui. */
+ scoped_restore_tmpl<struct ui *> m_save_ui;
};
-/* Functions to drive SWITCH_THRU_ALL_UIS. Though declared here by
- necessity, these functions should not be used other than via the
- SWITCH_THRU_ALL_UIS macro defined below. */
-extern void switch_thru_all_uis_init (struct switch_thru_all_uis *state);
-extern int switch_thru_all_uis_cond (struct switch_thru_all_uis *state);
-extern void switch_thru_all_uis_next (struct switch_thru_all_uis *state);
-
/* Traverse through all UI, and switch the current UI to the one
being iterated. */
-#define SWITCH_THRU_ALL_UIS(STATE) \
- for (switch_thru_all_uis_init (&STATE); \
- switch_thru_all_uis_cond (&STATE); \
- switch_thru_all_uis_next (&STATE))
+#define SWITCH_THRU_ALL_UIS() \
+ for (switch_thru_all_uis stau_state; !stau_state.done (); stau_state.next ())
/* Traverse over all UIs. */
#define ALL_UIS(UI) \
@@ -188,9 +210,6 @@ extern void delete_ui (struct ui *todel);
/* Cleanup that deletes a UI. */
extern struct cleanup *make_delete_ui_cleanup (struct ui *ui);
-/* Make a cleanup that restores the current UI. */
-extern struct cleanup *make_cleanup_restore_current_ui (void);
-
/* Register the UI's input file descriptor in the event loop. */
extern void ui_register_input_event_handler (struct ui *ui);