diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 7e50342..6b88601 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -1893,20 +1893,28 @@ int breakpoint_thread_match (CORE_ADDR pc, ptid_t ptid) { const struct bp_location *bpt; - int thread; - - thread = pid_to_thread_id (ptid); - + /* The thread ID associated to PTID, computed lazily. */ + int thread = -1; + ALL_BP_LOCATIONS (bpt) { if (bpt->loc_type != bp_loc_software_breakpoint && bpt->loc_type != bp_loc_hardware_breakpoint) continue; - if ((breakpoint_enabled (bpt->owner) - || bpt->owner->enable_state == bp_permanent) - && bpt->address == pc - && (bpt->owner->thread == -1 || bpt->owner->thread == thread)) + if (!breakpoint_enabled (bpt->owner) + && bpt->owner->enable_state != bp_permanent) + continue; + + if (bpt->address != pc) + continue; + + /* If this is a thread-specific breakpoint, and we haven't + computed the ptid's thread ID yet, compute it now. */ + if (bpt->owner->thread != -1 && thread == -1) + thread = pid_to_thread_id (ptid); + + if (bpt->owner->thread == -1 || bpt->owner->thread == thread) { if (overlay_debugging && section_is_overlay (bpt->section)