]> git.ipfire.org Git - thirdparty/binutils-gdb.git/commitdiff
fix exec_close to be multi-target-aware
authorPaul Koning <paul_koning@dell.com>
Mon, 26 Oct 2015 19:53:37 +0000 (15:53 -0400)
committerPaul Koning <paul_koning@dell.com>
Mon, 26 Oct 2015 19:53:37 +0000 (15:53 -0400)
This changes exec_close so it doesn't close inferiors from other
targets.

2014-07-29  Tom Tromey  <tromey@redhat.com>

* target.h (target_stack_decref_cleanup): Declare.
* exec.c (exec_xclose_1): Skip program spaces from other targets.
* target.c (target_stack_decref_cleanup): New function.

gdb/exec.c
gdb/target.c
gdb/target.h

index a2b29424aa0370b9640028f1c648ce3f8f841c38..3091cda5bebd0cbfed2c4aa9b5ae23c444da5b81 100644 (file)
@@ -113,10 +113,18 @@ exec_xclose_1 (struct target_ops *self)
 {
   struct program_space *ss;
   struct cleanup *old_chain;
+  struct target_stack *tstack = target_stack_incref ();
+
+  old_chain = make_cleanup (target_stack_decref_cleanup, tstack);
+  save_current_program_space ();
 
-  old_chain = save_current_program_space ();
   ALL_PSPACES (ss)
   {
+    /* Skip program spaces that are associated with some other
+       target.  */
+    if (ss->target_stack != tstack)
+      continue;
+
     set_current_program_space (ss);
     clear_section_table (current_target_sections);
     exec_close ();
index 1d7a4cf468180ed1770e20a565b5a33e9022ff16..d3fc6c5e4a74ee4867577c5b0408b8442e8b3d5e 100644 (file)
@@ -3926,6 +3926,14 @@ target_stack_decref (struct target_stack *tstack)
 
 /* See target.h.  */
 
+void
+target_stack_decref_cleanup (void *arg)
+{
+  target_stack_decref (arg);
+}
+
+/* See target.h.  */
+
 void
 target_stack_set_current (struct target_stack *tstack)
 {
index 78610bf7b4d7a31319166902ffdbc03ecde6badf..13865a292d5564a88e880c743b54d058c30ace68 100644 (file)
@@ -1265,6 +1265,10 @@ extern struct target_stack *target_stack_incref (void);
 
 extern void target_stack_decref (struct target_stack *);
 
+/* A wrapper for target_stack_decref suitable for use as a cleanup.  */
+
+extern void target_stack_decref_cleanup (void *arg);
+
 /* Set target_stack and current_target from TSTACK.  */
 
 extern void target_stack_set_current (struct target_stack *tstack);