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]

[PATCH]: linux and zombie threads


Mark -- these changes prepare the way for a libthread_db change
that will allow gdb to recognize zombie threads.
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.

Index: thread-db.c
===================================================================
RCS file: /cvs/src/src/gdb/thread-db.c,v
retrieving revision 1.13
diff -c -3 -p -r1.13 thread-db.c
*** thread-db.c	2001/05/15 00:03:36	1.13
--- thread-db.c	2001/05/23 00:05:41
*************** attach_thread (ptid_t ptid, const td_thr
*** 573,578 ****
--- 573,581 ----
    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);
*************** thread_db_mourn_inferior (void)
*** 894,904 ****
  static int
  thread_db_thread_alive (ptid_t ptid)
  {
    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;
--- 897,908 ----
  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))
      {
        err = td_ta_map_id2thr_p (thread_agent, GET_THREAD (ptid), &th);
        if (err != TD_OK)
  	return 0;
*************** thread_db_thread_alive (ptid_t ptid)
*** 907,912 ****
--- 911,923 ----
        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;
      }
  
*************** find_new_threads_callback (const td_thrh
*** 926,931 ****
--- 937,945 ----
    err = td_thr_get_info_p (th_p, &ti);
    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));
  

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