From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 19872 invoked by alias); 2 Jun 2003 19:18:21 -0000 Mailing-List: contact gdb-patches-help@sources.redhat.com; run by ezmlm Precedence: bulk List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sources.redhat.com Received: (qmail 19858 invoked from network); 2 Jun 2003 19:18:20 -0000 Received: from unknown (HELO mx1.redhat.com) (66.187.233.31) by sources.redhat.com with SMTP; 2 Jun 2003 19:18:20 -0000 Received: from int-mx2.corp.redhat.com (nat-pool-rdu-dmz.redhat.com [172.16.52.200] (may be forged)) by mx1.redhat.com (8.11.6/8.11.6) with ESMTP id h52JIKH21297 for ; Mon, 2 Jun 2003 15:18:20 -0400 Received: from potter.sfbay.redhat.com (potter.sfbay.redhat.com [172.16.27.15]) by int-mx2.corp.redhat.com (8.11.6/8.11.6) with ESMTP id h52JIJT32145 for ; Mon, 2 Jun 2003 15:18:19 -0400 Received: from redhat.com (reddwarf.sfbay.redhat.com [172.16.24.50]) by potter.sfbay.redhat.com (8.11.6/8.11.6) with ESMTP id h52JII022620; Mon, 2 Jun 2003 12:18:18 -0700 Message-ID: <3EDBA2FA.F5603372@redhat.com> Date: Mon, 02 Jun 2003 19:18:00 -0000 From: Michael Snyder Organization: Red Hat, Inc. X-Accept-Language: en MIME-Version: 1.0 To: "J. Johnston" CC: gdb-patches@sources.redhat.com Subject: Re: RFA: fix for thread events in thread-db.c References: <3EA6EDD8.8000100@redhat.com> Content-Type: text/plain; charset=us-ascii Content-Transfer-Encoding: 7bit X-SW-Source: 2003-06/txt/msg00085.txt.bz2 "J. Johnston" wrote: > > The attached patch fixes a long-standing problem in thread-db.c: check_event(). > When a create or death breakpoint is detected, the td_ta_event_getmsg() interface > from libthread_db is used to get "a message" from the queue. This message does not > necessarily match the breakpoint just reached. The td_ta_event_getmsg() interface > has to be used because we don't the lwp that has been created. > > The change made is to loop through all available messages and process them. > This ensures that the message set for the breakpoint is processed before > continuing. This change allows death events to be enabled, if desired. > > Ok to commit? This looks reasonable to me. Assuming you've tested it for both nptl and pre-nptl models, please check it in. Michael > > -- Jeff J. > > 2003-04-23 Jeff Johnston > > * 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. > > ------------------------------------------------------------------------------- > Index: thread-db.c > =================================================================== > RCS file: /cvs/src/src/gdb/thread-db.c,v > retrieving revision 1.30 > diff -u -r1.30 thread-db.c > --- thread-db.c 17 Apr 2003 17:30:02 -0000 1.30 > +++ thread-db.c 23 Apr 2003 19:37:47 -0000 > @@ -775,64 +775,73 @@ > 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)); > - } > + 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)); > + 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)); > + 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 > + 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."); > > - if (!in_thread_list (ptid)) > - error ("Spurious thread death event."); > + detach_thread (ptid, 1); > > - detach_thread (ptid, 1); > - return; > + break; > > - default: > - error ("Spurious thread event."); > + default: > + error ("Spurious thread event."); > + } > } > + while (loop); > } > > static ptid_t