aboutsummaryrefslogtreecommitdiff
path: root/gdb/inferior.h
diff options
context:
space:
mode:
authorAndrew Burgess <aburgess@redhat.com>2022-09-22 12:22:22 +0100
committerAndrew Burgess <aburgess@redhat.com>2022-12-14 13:57:22 +0000
commitc8181f706f5a481e9667195d1f5d1623db6cc7f2 (patch)
tree6f4bf3f6732629ce964a48226c97e32c3125989a /gdb/inferior.h
parent9678f8fe975c213c94735221dcb438395e4de9e1 (diff)
downloadgdb-c8181f706f5a481e9667195d1f5d1623db6cc7f2.zip
gdb-c8181f706f5a481e9667195d1f5d1623db6cc7f2.tar.gz
gdb-c8181f706f5a481e9667195d1f5d1623db6cc7f2.tar.bz2
gdb: remove the pop_all_targets (and friends) global functions
This commit removes the global functions pop_all_targets, pop_all_targets_above, and pop_all_targets_at_and_above, and makes them methods on the inferior class. As the pop_all_targets functions will unpush each target, which decrements the targets reference count, it is possible that the target might be closed. Right now, closing a target, in some cases, depends on the current inferior being set correctly, that is, to the inferior from which the target was popped. To facilitate this I have used switch_to_inferior_no_thread within the new methods. Previously it was the responsibility of the caller to ensure that the correct inferior was selected. In a couple of places (event-top.c and top.c) I have been able to remove a previous switch_to_inferior_no_thread call. In remote_unpush_target (remote.c) I have left the switch_to_inferior_no_thread call as it is required for the generic_mourn_inferior call.
Diffstat (limited to 'gdb/inferior.h')
-rw-r--r--gdb/inferior.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/gdb/inferior.h b/gdb/inferior.h
index 6fc0a30..8a53397 100644
--- a/gdb/inferior.h
+++ b/gdb/inferior.h
@@ -398,6 +398,22 @@ public:
target_ops *top_target ()
{ return m_target_stack.top (); }
+ /* Unpush all targets except the dummy target from m_target_stack. As
+ targets are removed from m_target_stack their reference count is
+ decremented, which may cause a target to close. */
+ void pop_all_targets ()
+ { pop_all_targets_above (dummy_stratum); }
+
+ /* Unpush all targets above STRATUM from m_target_stack. As targets are
+ removed from m_target_stack their reference count is decremented,
+ which may cause a target to close. */
+ void pop_all_targets_above (enum strata stratum);
+
+ /* Unpush all targets at and above STRATUM from m_target_stack. As
+ targets are removed from m_target_stack their reference count is
+ decremented, which may cause a target to close. */
+ void pop_all_targets_at_and_above (enum strata stratum);
+
/* Return the target at process_stratum level in this inferior's
target stack. */
struct process_stratum_target *process_target ()
@@ -616,6 +632,10 @@ public:
registry<inferior> registry_fields;
private:
+
+ /* Unpush TARGET and assert that it worked. */
+ void unpush_target_and_assert (struct target_ops *target);
+
/* The inferior's target stack. */
target_stack m_target_stack;