2008-07-28 Pedro Alves * target.h (pop_all_targets): Declare. * target.c (pop_all_targets): New. * top.c (quit_target): Pop all targets instead of just closing the current. --- gdb/target.c | 16 ++++++++++++++++ gdb/target.h | 7 +++++++ gdb/top.c | 5 +++-- 3 files changed, 26 insertions(+), 2 deletions(-) Index: src/gdb/target.c =================================================================== --- src.orig/gdb/target.c 2008-07-28 16:24:06.000000000 +0100 +++ src/gdb/target.c 2008-07-28 16:30:02.000000000 +0100 @@ -820,6 +820,22 @@ pop_target (void) internal_error (__FILE__, __LINE__, _("failed internal consistency check")); } +void +pop_all_targets (int quitting) +{ + while ((int) (current_target.to_stratum) > (int) dummy_stratum) + { + target_close (¤t_target, quitting); + if (unpush_target (target_stack) == 1) + return; + } + + fprintf_unfiltered (gdb_stderr, + "pop_all_targets couldn't find target %s\n", + current_target.to_shortname); + internal_error (__FILE__, __LINE__, _("failed internal consistency check")); +} + /* Using the objfile specified in OBJFILE, find the address for the current thread's thread-local storage with offset OFFSET. */ CORE_ADDR Index: src/gdb/target.h =================================================================== --- src.orig/gdb/target.h 2008-07-28 16:24:06.000000000 +0100 +++ src/gdb/target.h 2008-07-28 16:30:02.000000000 +0100 @@ -1172,6 +1172,13 @@ extern void target_preopen (int); extern void pop_target (void); +/* Does whatever cleanup is required to get rid of all pushed targets. + QUITTING is propagated to target_close; it indicates that GDB is + exiting and should not get hung on an error (otherwise it is + important to perform clean termination, even if it takes a + while). */ +extern void pop_all_targets (int quitting); + extern CORE_ADDR target_translate_tls_address (struct objfile *objfile, CORE_ADDR offset); Index: src/gdb/top.c =================================================================== --- src.orig/gdb/top.c 2008-07-28 16:24:06.000000000 +0100 +++ src/gdb/top.c 2008-07-28 16:30:48.000000000 +0100 @@ -1229,8 +1229,9 @@ quit_target (void *arg) target_kill (); } - /* UDI wants this, to kill the TIP. */ - target_close (¤t_target, 1); + /* Give all pushed targets a chance to do minimal cleanup, and pop + them all out. */ + pop_all_targets (1); /* Save the history information if it is appropriate to do so. */ if (write_history_p && history_filename)