2003-10-22 Andrew Cagney * 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". Index: target.c =================================================================== RCS file: /cvs/src/src/gdb/target.c,v retrieving revision 1.60 diff -u -r1.60 target.c --- target.c 21 Oct 2003 21:29:55 -0000 1.60 +++ target.c 22 Oct 2003 20:56:00 -0000 @@ -672,8 +672,7 @@ 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 @@ 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 @@ void pop_target (void) { - (current_target.to_close) (0); /* Let it clean up */ + target_close (¤t_target, 0); /* Let it clean up */ if (unpush_target (target_stack) == 1) return; @@ -1600,9 +1598,17 @@ 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 Index: target.h =================================================================== RCS file: /cvs/src/src/gdb/target.h,v retrieving revision 1.45 diff -u -r1.45 target.h --- target.h 17 Oct 2003 20:17:51 -0000 1.45 +++ target.h 22 Oct 2003 20:56:00 -0000 @@ -266,7 +266,15 @@ 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 @@ #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. */ - -#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. */ +/* 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_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: top.c =================================================================== RCS file: /cvs/src/src/gdb/top.c,v retrieving revision 1.81 diff -u -r1.81 top.c --- top.c 10 Oct 2003 07:13:11 -0000 1.81 +++ top.c 22 Oct 2003 20:56:00 -0000 @@ -1461,7 +1461,7 @@ } /* UDI wants this, to kill the TIP. */ - target_close (1); + target_close (¤t_target, 1); /* Save the history information if it is appropriate to do so. */ if (write_history_p && history_filename)