2003-06-05 Jeff Johnston <jjohnstn@redhat.com>

* thread-db.c (check_event): For create/death event breakpoints,
        loop through all messages to ensure that we read the message
        corresponding to the breakpoint we are at.
This commit is contained in:
Jeff Johnston 2003-06-05 18:22:02 +00:00
parent 54c60684a4
commit 4d9850d366
2 changed files with 64 additions and 49 deletions

View file

@ -1,3 +1,9 @@
2003-06-05 Jeff Johnston <jjohnstn@redhat.com>
* thread-db.c (check_event): For create/death event breakpoints,
loop through all messages to ensure that we read the message
corresponding to the breakpoint we are at.
2003-06-04 Michael Snyder <msnyder@redhat.com>
* h8300-tdep.c (h8300_gdbarch_init): Add h8300hn, h8300sn.

View file

@ -775,64 +775,73 @@ check_event (ptid_t ptid)
td_thrinfo_t ti;
td_err_e err;
CORE_ADDR stop_pc;
int loop = 0;
/* Bail out early if we're not at a thread event breakpoint. */
stop_pc = read_pc_pid (ptid) - DECR_PC_AFTER_BREAK;
if (stop_pc != td_create_bp_addr && stop_pc != td_death_bp_addr)
return;
err = td_ta_event_getmsg_p (thread_agent, &msg);
if (err != TD_OK)
/* If we are at a create breakpoint, we do not know what new lwp
was created and cannot specifically locate the event message for it.
We have to call td_ta_event_getmsg() to get
the latest message. Since we have no way of correlating whether
the event message we get back corresponds to our breakpoint, we must
loop and read all event messages, processing them appropriately.
This guarantees we will process the correct message before continuing
from the breakpoint.
Currently, death events are not enabled. If they are enabled,
the death event can use the td_thr_event_getmsg() interface to
get the message specifically for that lwp and avoid looping
below. */
loop = 1;
do
{
if (err == TD_NOMSG)
return;
err = td_ta_event_getmsg_p (thread_agent, &msg);
if (err != TD_OK)
{
if (err == TD_NOMSG)
return;
error ("Cannot get thread event message: %s", thread_db_err_str (err));
}
err = td_thr_get_info_p (msg.th_p, &ti);
if (err != TD_OK)
error ("check_event: cannot get thread info: %s",
thread_db_err_str (err));
ptid = BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
switch (msg.event)
{
case TD_CREATE:
#if 0
/* FIXME: kettenis/2000-08-26: Since we use td_ta_event_getmsg,
there is no guarantee that the breakpoint will match the
event. Should we use td_thr_event_getmsg instead? */
if (stop_pc != td_create_bp_addr)
error ("Thread creation event doesn't match breakpoint.");
#endif
/* We may already know about this thread, for instance when the
user has issued the `info threads' command before the SIGTRAP
for hitting the thread creation breakpoint was reported. */
if (!in_thread_list (ptid))
attach_thread (ptid, msg.th_p, &ti, 1);
return;
case TD_DEATH:
#if 0
/* FIXME: See TD_CREATE. */
if (stop_pc != td_death_bp_addr)
error ("Thread death event doesn't match breakpoint.");
#endif
if (!in_thread_list (ptid))
error ("Spurious thread death event.");
detach_thread (ptid, 1);
return;
default:
error ("Spurious thread event.");
error ("Cannot get thread event message: %s",
thread_db_err_str (err));
}
err = td_thr_get_info_p (msg.th_p, &ti);
if (err != TD_OK)
error ("Cannot get thread info: %s", thread_db_err_str (err));
ptid = BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
switch (msg.event)
{
case TD_CREATE:
/* We may already know about this thread, for instance when the
user has issued the `info threads' command before the SIGTRAP
for hitting the thread creation breakpoint was reported. */
if (!in_thread_list (ptid))
attach_thread (ptid, msg.th_p, &ti, 1);
break;
case TD_DEATH:
if (!in_thread_list (ptid))
error ("Spurious thread death event.");
detach_thread (ptid, 1);
break;
default:
error ("Spurious thread event.");
}
}
while (loop);
}
static ptid_t