2003-10-22 Andrew Cagney <cagney@redhat.com>
authorAndrew Cagney <cagney@redhat.com>
Wed, 22 Oct 2003 21:39:09 +0000 (21:39 +0000)
committerAndrew Cagney <cagney@redhat.com>
Wed, 22 Oct 2003 21:39:09 +0000 (21:39 +0000)
* target.c (target_close): New function.
(debug_to_close): Use "target_close".
(push_target): Use "target_close".
(unpush_target): Use "target_close".
(pop_target): Use "target_close".
* target.h (struct target_ops): Add "to_xclose".
(target_open): Delete macro.  Move comment to "to_open".
(target_close): Replace macro with function that takes a target.
* top.c (quit_target): Pass "current_target" to "target_close".

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

index fd9b2576736fe1b45ea5ca121711f959eeaa2c91..26114e7af7169c79b03a6728a42f41d14f92bd26 100644 (file)
@@ -1,3 +1,15 @@
+2003-10-22  Andrew Cagney  <cagney@redhat.com>
+
+       * target.c (target_close): New function.
+       (debug_to_close): Use "target_close".
+       (push_target): Use "target_close".
+       (unpush_target): Use "target_close".
+       (pop_target): Use "target_close".
+       * target.h (struct target_ops): Add "to_xclose".
+       (target_open): Delete macro.  Move comment to "to_open".
+       (target_close): Replace macro with function that takes a target.
+       * top.c (quit_target): Pass "current_target" to "target_close".
+
 2003-10-21  Elena Zannoni  <ezannoni@redhat.com>
 
        * minsyms.c (lookup_minimal_symbol_text): Remove unused parameter.
index b7d398b8e36f7721551af6b2ad0b2b31ea58b3fb..2677fb3f92c956df433838156113f3dc7664a10e 100644 (file)
@@ -672,8 +672,7 @@ push_target (struct target_ops *t)
       struct target_ops *tmp = (*cur);
       (*cur) = (*cur)->beneath;
       tmp->beneath = NULL;
-      if (tmp->to_close)
-       (tmp->to_close) (0);
+      target_close (tmp, 0);
     }
 
   /* We have removed all targets in our stratum, now add the new one.  */
@@ -698,8 +697,7 @@ unpush_target (struct target_ops *t)
   struct target_ops **cur;
   struct target_ops *tmp;
 
-  if (t->to_close)
-    t->to_close (0);           /* Let it clean up */
+  target_close (t, 0);
 
   /* Look for the specified target.  Note that we assume that a target
      can only occur once in the target stack. */
@@ -726,7 +724,7 @@ unpush_target (struct target_ops *t)
 void
 pop_target (void)
 {
-  (current_target.to_close) (0);       /* Let it clean up */
+  target_close (&current_target, 0);   /* Let it clean up */
   if (unpush_target (target_stack) == 1)
     return;
 
@@ -1600,11 +1598,19 @@ debug_to_open (char *args, int from_tty)
 static void
 debug_to_close (int quitting)
 {
-  debug_target.to_close (quitting);
-
+  target_close (&debug_target, quitting);
   fprintf_unfiltered (gdb_stdlog, "target_close (%d)\n", quitting);
 }
 
+void
+target_close (struct target_ops *targ, int quitting)
+{
+  if (targ->to_xclose != NULL)
+    targ->to_xclose (targ, quitting);
+  else if (targ->to_close != NULL)
+    targ->to_close (quitting);
+}
+
 static void
 debug_to_attach (char *args, int from_tty)
 {
index 7bee270a09d468e0efe86500acc025b3c0e46c76..b11647a00a6faa4221158f7891abcad258fbfa27 100644 (file)
@@ -266,7 +266,15 @@ struct target_ops
     char *to_doc;              /* Documentation.  Does not include trailing
                                   newline, and starts with a one-line descrip-
                                   tion (probably similar to to_longname).  */
+    /* The open routine takes the rest of the parameters from the
+       command, and (if successful) pushes a new target onto the
+       stack.  Targets should supply this routine, if only to provide
+       an error message.  */
     void (*to_open) (char *, int);
+    /* Old targets with a static target vector provide "to_close".
+       New re-entrant targets provide "to_xclose" and that is expected
+       to xfree everything (including the "struct target_ops").  */
+    void (*to_xclose) (struct target_ops *targ, int quitting);
     void (*to_close) (int);
     void (*to_attach) (char *, int);
     void (*to_post_attach) (int);
@@ -413,26 +421,16 @@ extern struct target_ops current_target;
 #define        target_shortname        (current_target.to_shortname)
 #define        target_longname         (current_target.to_longname)
 
-/* The open routine takes the rest of the parameters from the command,
-   and (if successful) pushes a new target onto the stack.
-   Targets should supply this routine, if only to provide an error message.  */
+/* Does whatever cleanup is required for a target that we are no
+   longer going to be calling.  QUITTING 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).  This routine
+   is automatically always called when popping the target off the
+   target stack (to_beneath is undefined).  Closing file descriptors
+   and freeing all memory allocated memory are typical things it
+   should do.  */
 
-#define        target_open(name, from_tty)                                     \
-  do {                                                                 \
-    dcache_invalidate (target_dcache);                                 \
-    (*current_target.to_open) (name, from_tty);                                \
-  } while (0)
-
-/* Does whatever cleanup is required for a target that we are no longer
-   going to be calling.  Argument says whether we are quitting gdb and
-   should not get hung in case of errors, or whether we want a clean
-   termination even if it takes a while.  This routine is automatically
-   always called just before a routine is popped off the target stack.
-   Closing file descriptors and freeing memory are typical things it should
-   do.  */
-
-#define        target_close(quitting)  \
-     (*current_target.to_close) (quitting)
+void target_close (struct target_ops *targ, int quitting);
 
 /* Attaches to a process on the target side.  Arguments are as passed
    to the `attach' command by the user.  This routine can be called
index 1e3399d18102d17609ff06f78ac074984837b6e7..46e323b09b5584078b717a0774ac347c8d031695 100644 (file)
--- a/gdb/top.c
+++ b/gdb/top.c
@@ -1461,7 +1461,7 @@ quit_target (void *arg)
     }
 
   /* UDI wants this, to kill the TIP.  */
-  target_close (1);
+  target_close (&current_target, 1);
 
   /* Save the history information if it is appropriate to do so.  */
   if (write_history_p && history_filename)