aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/breakpoint.c25
1 files changed, 16 insertions, 9 deletions
diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c
index 1cc9e84..dcb00bf 100644
--- a/gdb/breakpoint.c
+++ b/gdb/breakpoint.c
@@ -69,6 +69,7 @@
#include "tid-parse.h"
#include "cli/cli-style.h"
#include "cli/cli-decode.h"
+#include <unordered_set>
/* readline include files */
#include "readline/tilde.h"
@@ -7608,9 +7609,13 @@ set_longjmp_breakpoint_for_call_dummy (void)
void
check_longjmp_breakpoint_for_call_dummy (struct thread_info *tp)
{
- for (struct breakpoint *b : all_breakpoints_safe ())
+ /* We would need to delete breakpoints other than the current one while
+ iterating, so all_breakpoints_safe is not sufficient to make that safe.
+ Save all breakpoints to delete in that set and delete them at the end. */
+ std::unordered_set<breakpoint *> to_delete;
+
+ for (struct breakpoint *b : all_breakpoints ())
{
- struct breakpoint *b_tmp = b->next;
if (b->type == bp_longjmp_call_dummy && b->thread == tp->global_num)
{
struct breakpoint *dummy_b = b->related_breakpoint;
@@ -7666,15 +7671,17 @@ check_longjmp_breakpoint_for_call_dummy (struct thread_info *tp)
dummy_frame_discard (dummy_b->frame_id, tp);
- while (b->related_breakpoint != b)
- {
- if (b_tmp == b->related_breakpoint)
- b_tmp = b->related_breakpoint->next;
- delete_breakpoint (b->related_breakpoint);
- }
- delete_breakpoint (b);
+ for (breakpoint *related_breakpoint = b->related_breakpoint;
+ related_breakpoint != b;
+ related_breakpoint = related_breakpoint->related_breakpoint)
+ to_delete.insert (b->related_breakpoint);
+
+ to_delete.insert (b);
}
}
+
+ for (breakpoint *b : to_delete)
+ delete_breakpoint (b);
}
void