This is the mail archive of the gdb-patches@sources.redhat.com mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: lin-lwp and exiting threads


Daniel Jacobowitz wrote:
On Tue, Aug 26, 2003 at 01:51:35PM -0400, Daniel Jacobowitz wrote:

Hi Jeff,

I'm doing some work in lin-lwp.c and I saw this bit you recently committed:

+      /* Check if the current LWP has previously exited.  For nptl threads,
+         there is no exit signal issued for LWPs that are not the
+         main thread so we should check whenever the thread is stopped.  */
+      if (!lin_lwp_thread_alive (lp->ptid))
+       {
+         if (in_thread_list (lp->ptid))
+           {
+             /* Core GDB cannot deal with us deleting the current
+                thread.  */
+             if (!ptid_equal (lp->ptid, inferior_ptid))
+               delete_thread (lp->ptid);
+             printf_unfiltered ("[%s exited]\n",
+                                target_pid_to_str (lp->ptid));
+           }
+         if (debug_lin_lwp)
+           fprintf_unfiltered (gdb_stdlog,
+                               "SWC: %s already exited.\n",
                               target_pid_to_str (lp->ptid));


This is right after waitpid has returned a non-exiting stopped status for lp->ptid. Were you just being thorough, or do you have some reason to believe that waitpid would ever return WIFSTOPPED (status) and yet the thread would be dead?


In the early days of nptl, the kernel wasn't always doing what it was expected to. This appears to be leftover code as I attempted to ensure we caught the thread exiting one way or another.


Also, there's:
pid = waitpid (GET_LWP (lp->ptid), &status, 0);
if (pid == -1 && errno == ECHILD)
{
pid = waitpid (GET_LWP (lp->ptid), &status, __WCLONE);
if (pid == -1 && errno == ECHILD)
{
/* The thread has previously exited. We need to delete it now
because in the case of NPTL threads, there won't be an
exit event unless it is the main thread. */
if (debug_lin_lwp)
fprintf_unfiltered (gdb_stdlog,
"SWC: %s exited.\n",
target_pid_to_str (lp->ptid));
delete_lwp (lp->ptid);
return 0;
}
}
Is there some reason you don't also call delete_thread?



Hmm, appears to be an oversight on my part.


Do you want to make these changes?

-- Jeff J.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]