--- ../orig/gdb/breakpoint.c +++ ./gdb/breakpoint.c @@ -7267,7 +7267,8 @@ /* We compare bp_location.length in order to cover ranged breakpoints. */ return (breakpoint_address_match (loc1->pspace->aspace, loc1->address, loc2->pspace->aspace, loc2->address) - && loc1->length == loc2->length); + && loc1->length == loc2->length + && loc1->thread == loc2->thread); } static void @@ -7354,6 +7355,10 @@ loc->cond_bytecode = NULL; loc->shlib_disabled = 0; loc->enabled = 1; + loc->thread = owner->thread; + loc->target_info.thread = owner->thread; + loc->overlay_target_info.thread = owner->thread; + loc->thread = owner->thread; switch (owner->type) { @@ -8984,6 +8989,9 @@ copy->loc->line_number = orig->loc->line_number; copy->loc->symtab = orig->loc->symtab; copy->loc->enabled = loc_enabled; + copy->loc->thread = orig->loc->thread; + copy->loc->target_info.thread = orig->loc->thread; + copy->loc->overlay_target_info.thread = orig->loc->thread; copy->frame_id = orig->frame_id; copy->thread = orig->thread; copy->pspace = orig->pspace; @@ -9302,6 +9310,9 @@ { init_raw_breakpoint (b, gdbarch, sal, type, ops); b->thread = thread; + b->loc->thread = thread; + b->loc->target_info.thread = thread; + b->loc->overlay_target_info.thread = thread; b->task = task; b->cond_string = cond_string; @@ -9655,6 +9666,10 @@ *task = 0; *rest = NULL; + /* default to current thread on non-stop targets */ + if (target_is_non_stop_p ()) + *thread = inferior_thread ()->global_num; + while (tok && *tok) { const char *end_tok; @@ -9946,6 +9961,9 @@ } b->cond_string = cond_string; b->thread = thread; + b->loc->thread = thread; + b->loc->target_info.thread = thread; + b->loc->overlay_target_info.thread = thread; } /* Create a private copy of any extra string. */ --- ../orig/gdb/breakpoint.h +++ ./gdb/breakpoint.h @@ -279,6 +279,9 @@ /* Flag that is true if the breakpoint should be left in place even when GDB is not connected. */ int persist; + + /* Thread identifier for which this breakpoint should be activated */ + int thread; }; /* GDB maintains two types of information about each breakpoint (or @@ -399,7 +402,8 @@ char duplicate; /* If we someday support real thread-specific breakpoints, then - the breakpoint location will need a thread identifier. */ + the breakpoint location will need a thread identifier. */ + int thread; /* Data for specific breakpoint types. These could be a union, but simplicity is more important than memory usage for breakpoints. */ --- ../orig/gdb/remote.c +++ ./gdb/remote.c @@ -9300,7 +9300,12 @@ addr = (ULONGEST) remote_address_masked (addr); p += hexnumstr (p, addr); xsnprintf (p, endbuf - p, ",%d", bpsize); - + p += strlen(p); + if (bp_tgt->thread >= 0) + { + *(p++) = ','; + write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread)); + } if (remote_supports_cond_breakpoints (ops)) remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf); @@ -9358,6 +9363,12 @@ addr = (ULONGEST) remote_address_masked (bp_tgt->placed_address); p += hexnumstr (p, addr); xsnprintf (p, endbuf - p, ",%d", bp_tgt->placed_size); + p += strlen(p); + if (bp_tgt->thread >= 0) + { + *(p++) = ','; + write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread)); + } putpkt (rs->buf); getpkt (&rs->buf, &rs->buf_size, 0); @@ -9619,6 +9630,12 @@ addr = remote_address_masked (addr); p += hexnumstr (p, (ULONGEST) addr); xsnprintf (p, endbuf - p, ",%x", bpsize); + p += strlen(p); + if (bp_tgt->thread >= 0) + { + *(p++) = ','; + write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread)); + } if (remote_supports_cond_breakpoints (self)) remote_add_target_side_condition (gdbarch, bp_tgt, p, endbuf); @@ -9675,6 +9692,12 @@ addr = remote_address_masked (bp_tgt->placed_address); p += hexnumstr (p, (ULONGEST) addr); xsnprintf (p, endbuf - p, ",%x", bp_tgt->placed_size); + p += strlen(p); + if (bp_tgt->thread >= 0) + { + *(p++) = ','; + write_ptid (p, endbuf, global_thread_id_to_ptid (bp_tgt->thread)); + } putpkt (rs->buf); getpkt (&rs->buf, &rs->buf_size, 0);