2001-05-22 Michael Snyder <msnyder@redhat.com>
authorMichael Snyder <msnyder@vmware.com>
Wed, 23 May 2001 00:06:15 +0000 (00:06 +0000)
committerMichael Snyder <msnyder@vmware.com>
Wed, 23 May 2001 00:06:15 +0000 (00:06 +0000)
* thread-db.c: Allow for defunct zombie threads.
(attach_thread): Do not attempt to attach zombie thread.
(thread_db_thread_alive): Return false for defunct zombie thread.
(find_new_threads_callback): Don't add defunct zombie thread to list.

gdb/ChangeLog
gdb/thread-db.c

index 26001029befef1b58e0ca21aa2b781f6d9715579..ec08affe090af4127a8893c5d1a69aa445bc0706 100644 (file)
@@ -1,3 +1,10 @@
+2001-05-22  Michael Snyder  <msnyder@redhat.com>
+
+       * thread-db.c: Allow for defunct zombie threads.        
+       (attach_thread): Do not attempt to attach zombie thread.
+       (thread_db_thread_alive): Return false for defunct zombie thread.
+       (find_new_threads_callback): Don't add defunct zombie thread to list.
+
 2001-05-22  Jim Blandy  <jimb@redhat.com>
 
        Add support for the GNU V3 C++ ABI.
index a54f9fb6ed34f49183f7c282766015481d6416f4..d989c4910ab2360835bbfe8083fe1a741a512657 100644 (file)
@@ -573,6 +573,9 @@ attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
   tp->private = xmalloc (sizeof (struct private_thread_info));
   tp->private->lwpid = ti_p->ti_lid;
 
+  if (ti_p->ti_state == TD_THR_UNKNOWN)
+    return;/* A zombie thread that's been joined -- do not attach. */
+
   /* Under Linux, we have to attach to each and every thread.  */
 #ifdef ATTACH_LWP
   ATTACH_LWP (BUILD_LWP (ti_p->ti_lid, GET_PID (ptid)), 0);
@@ -894,11 +897,12 @@ thread_db_mourn_inferior (void)
 static int
 thread_db_thread_alive (ptid_t ptid)
 {
+  td_thrhandle_t th;
+  td_thrinfo_t   ti;
+  td_err_e       err;
+
   if (is_thread (ptid))
     {
-      td_thrhandle_t th;
-      td_err_e err;
-
       err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
       if (err != TD_OK)
        return 0;
@@ -907,6 +911,13 @@ thread_db_thread_alive (ptid_t ptid)
       if (err != TD_OK)
        return 0;
 
+      err = td_thr_get_info_p (&th, &ti);
+      if (err != TD_OK)
+       return 0;
+
+      if (ti.ti_state == TD_THR_UNKNOWN)
+       return 0;       /* A zombie thread that's been joined. */
+
       return 1;
     }
 
@@ -927,6 +938,9 @@ find_new_threads_callback (const td_thrhandle_t *th_p, void *data)
   if (err != TD_OK)
     error ("Cannot get thread info: %s", thread_db_err_str (err));
 
+  if (ti.ti_state == TD_THR_UNKNOWN)
+    return 0;  /* A zombie that's been reaped -- ignore. */
+
   ptid = BUILD_THREAD (ti.ti_tid, GET_PID (inferior_ptid));
 
   if (! in_thread_list (ptid))