aboutsummaryrefslogtreecommitdiff
path: root/gdb
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2008-08-16 22:12:18 +0000
committerPedro Alves <palves@redhat.com>2008-08-16 22:12:18 +0000
commitaa76d38d1d90e7958dba24494b15ec9798f50229 (patch)
tree3cd16b4ff66b0810d01a9d7ff02880c8aef4e28c /gdb
parent311a4e6b7b004617841f2a6c657e76dddd7d2249 (diff)
downloadgdb-aa76d38d1d90e7958dba24494b15ec9798f50229.zip
gdb-aa76d38d1d90e7958dba24494b15ec9798f50229.tar.gz
gdb-aa76d38d1d90e7958dba24494b15ec9798f50229.tar.bz2
* 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.
Diffstat (limited to 'gdb')
-rw-r--r--gdb/ChangeLog7
-rw-r--r--gdb/target.c18
-rw-r--r--gdb/target.h7
-rw-r--r--gdb/top.c5
4 files changed, 35 insertions, 2 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index 6b183d3..df1cb37 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,10 @@
+2008-08-16 Pedro Alves <pedro@codesourcery.com>
+
+ * 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.
+
2008-08-16 Vladimir Prus <vladimir@codesourcery.com>
Thiago Jung Bauermann <bauerman@br.ibm.com>
diff --git a/gdb/target.c b/gdb/target.c
index 6cda095..384fa20 100644
--- a/gdb/target.c
+++ b/gdb/target.c
@@ -821,6 +821,24 @@ 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 (&current_target, quitting);
+ if (!unpush_target (target_stack))
+ {
+ 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"));
+ break;
+ }
+ }
+}
+
/* Using the objfile specified in OBJFILE, find the address for the
current thread's thread-local storage with offset OFFSET. */
CORE_ADDR
diff --git a/gdb/target.h b/gdb/target.h
index e242566..e92176f 100644
--- a/gdb/target.h
+++ b/gdb/target.h
@@ -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);
diff --git a/gdb/top.c b/gdb/top.c
index 7f46caf..0ae7ea0 100644
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1222,8 +1222,9 @@ quit_target (void *arg)
target_kill ();
}
- /* UDI wants this, to kill the TIP. */
- target_close (&current_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)