RFA: fix for thread events in thread-db.c

J. Johnston jjohnstn@redhat.com
Thu Jun 5 18:22:00 GMT 2003


Patch checked in.  Thanks.

-- Jeff J.

Michael Snyder wrote:
> "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  <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.
>>
>>  -------------------------------------------------------------------------------
>>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
> 
> 




More information about the Gdb-patches mailing list