PERFORCE change 74825 for review

David Xu davidxu at FreeBSD.org
Sat Apr 9 20:32:30 PDT 2005


http://perforce.freebsd.org/chv.cgi?CH=74825

Change 74825 by davidxu at davidxu_tiger on 2005/04/10 03:32:16

	Enable initial thread to report events.

Affected files ...

.. //depot/projects/davidxu_thread/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#9 edit

Differences ...

==== //depot/projects/davidxu_thread/src/gnu/usr.bin/gdb/libgdb/fbsd-threads.c#9 (text+ko) ====

@@ -138,6 +138,9 @@
 /* Prototypes for local functions.  */
 static void fbsd_thread_find_new_threads (void);
 static int fbsd_thread_alive (ptid_t ptid);
+static void attach_thread (ptid_t ptid, const td_thrhandle_t *th_p,
+               const td_thrinfo_t *ti_p, int verbose);
+static void fbsd_thread_detach (char *args, int from_tty);
 
 /* Building process ids.  */
 
@@ -233,23 +236,21 @@
 
 /* Convert LWP to user-level thread id. */
 static ptid_t
-thread_from_lwp (ptid_t ptid)
+thread_from_lwp (ptid_t ptid, td_thrhandle_t *th, td_thrinfo_t *ti)
 {
-  td_thrinfo_t ti;
-  td_thrhandle_t th;
   td_err_e err;
  
   gdb_assert (IS_LWP (ptid));
 
   if (fbsd_thread_active)
     {
-      err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), &th);
+      err = td_ta_map_lwp2thr_p (thread_agent, GET_LWP (ptid), th);
       if (err == TD_OK)
         {
-          err = td_thr_get_info_p (&th, &ti);
+          err = td_thr_get_info_p (th, ti);
           if (err != TD_OK)
             error ("Cannot get thread info: %s", thread_db_err_str (err));
-          return BUILD_THREAD (ti.ti_tid, GET_PID (ptid));
+          return BUILD_THREAD (ti->ti_tid, GET_PID (ptid));
         }
     }
 
@@ -290,14 +291,19 @@
 static void
 get_current_thread ()
 {
+  td_thrhandle_t th;
+  td_thrinfo_t ti;
   long lwp;
   ptid_t tmp, ptid;
 
   lwp = get_current_lwp (proc_handle.pid);
   tmp = BUILD_LWP (lwp, proc_handle.pid);
-  ptid = thread_from_lwp (tmp);
+  ptid = thread_from_lwp (tmp, &th, &ti);
   if (!in_thread_list (ptid))
     {
+#if 0
+      attach_thread (ptid, &th, &ti, 1);
+#endif
       add_thread (ptid);
     }
   inferior_ptid = ptid;
@@ -648,7 +654,7 @@
   /* Add the thread to GDB's thread list.  */
   if (!in_thread_list (ptid))
     add_thread (ptid);
- 
+
   if (verbose)
     printf_unfiltered ("[New %s]\n", target_pid_to_str (ptid));
 
@@ -724,17 +730,24 @@
   ptid_t ret;
   long lwp;
   CORE_ADDR stop_pc;
+  td_thrhandle_t th;
+  td_thrinfo_t ti;
 
   ret = child_ops.to_wait (ptid, ourstatus);
   if (GET_PID(ret) >= 0 && ourstatus->kind == TARGET_WAITKIND_STOPPED)
     {
       lwp = get_current_lwp (GET_PID(ret));
-      ret = thread_from_lwp (BUILD_LWP(lwp, GET_PID(ret)));
+      ret = thread_from_lwp (BUILD_LWP(lwp, GET_PID(ret)),
+         &th, &ti);
+      if (!in_thread_list(ret)) {
+        /*
+         * We have to enable event reporting for initial thread
+         * which was not mapped before.
+	 */
+        attach_thread(ret, &th, &ti, 1);
+      }
       if (ourstatus->value.sig == TARGET_SIGNAL_TRAP)
         check_event(ret);
-#if 0
-      if (!in_thread_list (ret))
-        add_thread (ret);
       /* this is a hack, if an event won't cause gdb to stop, for example,
          SIGARLM, gdb resumes the process immediatly without setting
          inferior_ptid to the new thread returned here, this is a bug
@@ -745,7 +758,6 @@
           delete_thread (inferior_ptid);
           inferior_ptid = ret;
         }
-#endif
     }
 
   return (ret);


More information about the p4-projects mailing list