* target.h (pop_all_targets): Declare.
authorPedro Alves <palves@redhat.com>
Sat, 16 Aug 2008 22:12:18 +0000 (22:12 +0000)
committerPedro Alves <palves@redhat.com>
Sat, 16 Aug 2008 22:12:18 +0000 (22:12 +0000)
* target.c (pop_all_targets): New.
* top.c (quit_target): Pop all targets instead of just closing the
current.

gdb/ChangeLog
gdb/target.c
gdb/target.h
gdb/top.c

index 6b183d33d9acbeb13f3aeff541f4d7b304c972a6..df1cb37f32855a80ed215d8b3ae3f3fb3ccddccf 100644 (file)
@@ -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>
 
index 6cda0959a6902fcec458b71acaa94e6eabb2be3e..384fa209fb9e013ef9532d8668d8d2357a8e3288 100644 (file)
@@ -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
index e2425667ea8e307b53a94888152a48cc5a9f091d..e92176f83ccd1429b1176e439abe36b9a51205d3 100644 (file)
@@ -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 7f46cafb0cc2c2e2a8f856b13bf87ca037dc3973..0ae7ea020ff968ed2e7607cc2d3640e168c1fc62 100644 (file)
--- 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)