From mboxrd@z Thu Jan 1 00:00:00 1970 From: Don Howard To: Andrew Cagney Cc: Fernando Nasser , Michael Snyder , Subject: Re: [RFA] deleting breakpoints inside of 'commands' [Repost] Date: Thu, 20 Sep 2001 15:24:00 -0000 Message-id: References: <3BA8B70D.7040506@cygnus.com> X-SW-Source: 2001-09/msg00279.html Here is a patch that I hope will satisfy all sides. The patch below changes free_command_lines() to check if we are currently 'executing_breakpoint_commands'. If so, the command list is appended to a list of 'orphaned_command_lines'. When the execution of the command list completes, the orphaned_command_lines are then deleted. Should I make the global variables static and add accessor/mutator functions? What is the policy on globals? Comments? 2001-09-20 Don Howard * cli/cli-script.c (free_command_lines): Avoid deleting command_line lists while executing that list. * breakpoint.c: (executing_breakpoint_commands): Make this global visible to other compilation units. (orphaned_breakpoint_commands) New global. (bpstat_do_actions): Free orphaned command_line structures once done executing them. Index: gdb/breakpoint.c =================================================================== RCS file: /cvs/src/src/gdb/breakpoint.c,v retrieving revision 1.53 diff -p -u -w -r1.53 breakpoint.c --- breakpoint.c 2001/09/18 05:00:48 1.53 +++ breakpoint.c 2001/09/20 22:18:17 @@ -221,8 +221,11 @@ extern int addressprint; /* Print machin static int internal_breakpoint_number = -1; /* Are we executing breakpoint commands? */ -static int executing_breakpoint_commands; +int executing_breakpoint_commands; +/* List of breakpoint commands to be cleaned up after we are done executing them. */ +struct command_line * orphaned_breakpoint_commands; + /* Walk the following statement or block through all breakpoints. ALL_BREAKPOINTS_SAFE does so even if the statment deletes the current breakpoint. */ @@ -1845,6 +1848,7 @@ top: } executing_breakpoint_commands = 0; + free_command_lines (&orphaned_breakpoint_commands); discard_cleanups (old_chain); } Index: gdb/cli/cli-script.c =================================================================== RCS file: /cvs/src/src/gdb/cli/cli-script.c,v retrieving revision 1.7 diff -p -u -w -r1.7 cli-script.c --- cli-script.c 2001/06/17 15:16:12 1.7 +++ cli-script.c 2001/09/20 22:18:17 @@ -1014,7 +1014,25 @@ free_command_lines (struct command_line register struct command_line *next; struct command_line **blist; int i; + extern int executing_breakpoint_commands; + extern struct command_line * orphaned_breakpoint_commands; + /* Avoid deleting command_line lists while executing that list. */ + if (executing_breakpoint_commands) + { + struct command_line **b = NULL; + + /* Find the end of the orphaned_breakpoint_commands list */ + for (b = &orphaned_breakpoint_commands; *b; b = &((*b)->next)) + /* Nothing */ + ; + + /* Append the passed-in list */ + *b = *lptr; + *lptr = NULL; + return; + } + while (l) { if (l->body_count > 0) -- -Don dhoward@redhat.com gdb engineering