From: Paul Koning Date: Mon, 26 Oct 2015 19:53:37 +0000 (-0400) Subject: fix exec_close to be multi-target-aware X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=e0063bdcde2623cfb17c1f517f42c8924d463c2b;p=thirdparty%2Fbinutils-gdb.git fix exec_close to be multi-target-aware This changes exec_close so it doesn't close inferiors from other targets. 2014-07-29 Tom Tromey * 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. --- diff --git a/gdb/exec.c b/gdb/exec.c index a2b29424aa0..3091cda5beb 100644 --- a/gdb/exec.c +++ b/gdb/exec.c @@ -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 (); diff --git a/gdb/target.c b/gdb/target.c index 1d7a4cf4681..d3fc6c5e4a7 100644 --- a/gdb/target.c +++ b/gdb/target.c @@ -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) { diff --git a/gdb/target.h b/gdb/target.h index 78610bf7b4d..13865a292d5 100644 --- a/gdb/target.h +++ b/gdb/target.h @@ -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);