From: Vladimir Prus Date: Fri, 17 Aug 2007 17:06:04 +0000 (+0000) Subject: * breakpoint.c (bpstat_free): New. X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=198757a8b19977e7d4bb048dac03fb207ce228ac;p=binutils-gdb.git * breakpoint.c (bpstat_free): New. (bpstat_clear): Use bpstat_free. (delete_breakpoint): Document why we cannot remove bpstats from stop_bpstat. * breakpoint.h (bpstat_free): Declare. --- diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 43428c13517..5e50fa6271d 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2007-08-17 Vladimir Prus + + * breakpoint.c (bpstat_free): New. + (bpstat_clear): Use bpstat_free. + (delete_breakpoint): Document why we cannot + remove bpstats from stop_bpstat. + * breakpoint.h (bpstat_free): Declare. + 2007-08-16 Michael Snyder * event-loop.c (gdb_wait_for_event): Move statement into "if" block. diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index f798710dfb8..3875aacd5a5 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1897,6 +1897,15 @@ ep_is_exception_catchpoint (struct breakpoint *ep) || (ep->type == bp_catch_throw); } +void +bpstat_free (bpstat bs) +{ + if (bs->old_val != NULL) + value_free (bs->old_val); + free_command_lines (&bs->commands); + xfree (bs); +} + /* Clear a bpstat so that it says we are not at any breakpoint. Also free any storage that is part of a bpstat. */ @@ -1912,10 +1921,7 @@ bpstat_clear (bpstat *bsp) while (p != NULL) { q = p->next; - if (p->old_val != NULL) - value_free (p->old_val); - free_command_lines (&p->commands); - xfree (p); + bpstat_free (p); p = q; } *bsp = NULL; @@ -7051,7 +7057,13 @@ delete_breakpoint (struct breakpoint *bpt) /* Be sure no bpstat's are pointing at it after it's been freed. */ /* FIXME, how can we find all bpstat's? - We just check stop_bpstat for now. */ + We just check stop_bpstat for now. Note that we cannot just + remove bpstats pointing at bpt from the stop_bpstat list + entirely, as breakpoint commands are associated with the bpstat; + if we remove it here, then the later call to + bpstat_do_actions (&stop_bpstat); + in event-top.c won't do anything, and temporary breakpoints + with commands won't work. */ for (bs = stop_bpstat; bs; bs = bs->next) if (bs->breakpoint_at == bpt) { diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index b7996a5b372..701d85c3c30 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -430,9 +430,12 @@ struct breakpoint typedef struct bpstats *bpstat; -/* Interface: */ -/* Clear a bpstat so that it says we are not at any breakpoint. - Also free any storage that is part of a bpstat. */ +/* Frees any storage that is part of a bpstat. + Does not walk the 'next' chain. */ +extern void bpstat_free (bpstat); + +/* Clears a chain of bpstat, freeing storage + of each. */ extern void bpstat_clear (bpstat *); /* Return a copy of a bpstat. Like "bs1 = bs2" but all storage that