* inf-ttrace.c (inf_ttrace_follow_fork): Register the main thread
authorPedro Alves <palves@redhat.com>
Mon, 8 Sep 2008 21:27:45 +0000 (21:27 +0000)
committerPedro Alves <palves@redhat.com>
Mon, 8 Sep 2008 21:27:45 +0000 (21:27 +0000)
of the child fork.
(inf_ttrace_attach): Add the main thread.
(inf_ttrace_resume_callback): Check for exited threads.  Adjust
for always a thread.
(inf_ttrace_wait): Decorate the main thread's ptid with lwp info
using thread_change_ptid, and set its private data.  Don't add the
main thread here.
(inf_ttrace_pid_to_str): Adjust.

gdb/ChangeLog
gdb/inf-ttrace.c

index f5f8452..fc51ff1 100644 (file)
@@ -1,5 +1,17 @@
 2008-09-08  Pedro Alves  <pedro@codesourcery.com>
 
+       * inf-ttrace.c (inf_ttrace_follow_fork): Register the main thread
+       of the child fork.
+       (inf_ttrace_attach): Add the main thread.
+       (inf_ttrace_resume_callback): Check for exited threads.  Adjust
+       for always a thread.
+       (inf_ttrace_wait): Decorate the main thread's ptid with lwp info
+       using thread_change_ptid, and set its private data.  Don't add the
+       main thread here.
+       (inf_ttrace_pid_to_str): Adjust.
+
+2008-09-08  Pedro Alves  <pedro@codesourcery.com>
+
        * bsd-uthread.c (bsd_uthread_wait): Decorate the main thread with
        thread_change_ptid.  Check for exited threads.
        (bsd_uthread_find_new_threads): Check for exited threads.
index c0b75c7..3774b00 100644 (file)
@@ -513,10 +513,22 @@ Detaching after fork from child process %ld.\n"), (long)fpid);
 
   if (follow_child)
     {
+      struct thread_info *ti;
+
       /* The child will start out single-threaded.  */
-      inf_ttrace_num_lwps = 0;
+      inf_ttrace_num_lwps = 1;
       inf_ttrace_num_lwps_in_syscall = 0;
 
+      /* Delete parent.  */
+      delete_thread_silent (ptid_build (pid, lwpid, 0));
+
+      /* Add child.  inferior_ptid was already set above.  */
+      ti = add_thread_silent (inferior_ptid);
+      ti->private =
+       xmalloc (sizeof (struct inf_ttrace_private_thread_info));
+      memset (ti->private, 0,
+             sizeof (struct inf_ttrace_private_thread_info));
+
       /* Reset breakpoints in the child as appropriate.  */
       follow_inferior_reset_breakpoints ();
     }
@@ -721,8 +733,13 @@ inf_ttrace_attach (char *args, int from_tty)
              (uintptr_t)&tte, sizeof tte, 0) == -1)
     perror_with_name (("ttrace"));
 
-  inferior_ptid = pid_to_ptid (pid);
   push_target (ttrace_ops_hack);
+
+  /* We'll bump inf_ttrace_num_lwps up and add the private data to the
+     thread as soon as we get to inf_ttrace_wait.  At this point, we
+     don't have lwpid info yet.  */
+  inferior_ptid = pid_to_ptid (pid);
+  add_thread_silent (inferior_ptid);
 }
 
 static void
@@ -787,7 +804,7 @@ inf_ttrace_kill (void)
 static int
 inf_ttrace_resume_callback (struct thread_info *info, void *arg)
 {
-  if (!ptid_equal (info->ptid, inferior_ptid))
+  if (!ptid_equal (info->ptid, inferior_ptid) && !is_exited (info->ptid))
     {
       pid_t pid = ptid_get_pid (info->ptid);
       lwpid_t lwpid = ptid_get_lwp (info->ptid);
@@ -824,7 +841,7 @@ inf_ttrace_resume (ptid_t ptid, int step, enum target_signal signal)
   if (ttrace (request, pid, lwpid, TT_NOPC, sig, 0) == -1)
     perror_with_name (("ttrace"));
 
-  if (ptid_equal (ptid, minus_one_ptid) && inf_ttrace_num_lwps > 0)
+  if (ptid_equal (ptid, minus_one_ptid))
     {
       /* Let all the other threads run too.  */
       iterate_over_threads (inf_ttrace_resume_callback, NULL);
@@ -886,6 +903,30 @@ inf_ttrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
 
   ptid = ptid_build (tts.tts_pid, tts.tts_lwpid, 0);
 
+  if (inf_ttrace_num_lwps == 0)
+    {
+      struct thread_info *ti;
+
+      inf_ttrace_num_lwps = 1;
+
+      /* This is the earliest we hear about the lwp member of
+        INFERIOR_PTID, after an attach or fork_inferior.  */
+      gdb_assert (ptid_get_lwp (inferior_ptid) == 0);
+
+      /* We haven't set the private member on the main thread yet.  Do
+        it now.  */
+      ti = find_thread_pid (inferior_ptid);
+      gdb_assert (ti != NULL && ti->private == NULL);
+      ti->private =
+       xmalloc (sizeof (struct inf_ttrace_private_thread_info));
+      memset (ti->private, 0,
+             sizeof (struct inf_ttrace_private_thread_info));
+
+      /* Notify the core that this ptid changed.  This changes
+        inferior_ptid as well.  */
+      thread_change_ptid (inferior_ptid, ptid);
+    }
+
   switch (tts.tts_event)
     {
 #ifdef TTEVT_BPT_SSTEP
@@ -958,17 +999,6 @@ inf_ttrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
     case TTEVT_LWP_CREATE:
       lwpid = tts.tts_u.tts_thread.tts_target_lwpid;
       ptid = ptid_build (tts.tts_pid, lwpid, 0);
-      if (inf_ttrace_num_lwps == 0)
-       {
-         /* Now that we're going to be multi-threaded, add the
-            original thread to the list first.  */
-         ti = add_thread (ptid_build (tts.tts_pid, tts.tts_lwpid, 0));
-         ti->private =
-           xmalloc (sizeof (struct inf_ttrace_private_thread_info));
-         memset (ti->private, 0,
-                 sizeof (struct inf_ttrace_private_thread_info));
-         inf_ttrace_num_lwps++;
-       }
       ti = add_thread (ptid);
       ti->private =
        xmalloc (sizeof (struct inf_ttrace_private_thread_info));
@@ -1045,11 +1075,6 @@ inf_ttrace_wait (ptid_t ptid, struct target_waitstatus *ourstatus)
   if (ttrace (TT_PROC_STOP, tts.tts_pid, 0, 0, 0, 0) == -1)
     perror_with_name (("ttrace"));
 
-  /* HACK: Twiddle INFERIOR_PTID such that the initial thread of a
-     process isn't recognized as a new thread.  */
-  if (ptid_get_lwp (inferior_ptid) == 0)
-    inferior_ptid = ptid;
-
   return ptid;
 }
 
@@ -1128,18 +1153,17 @@ inf_ttrace_thread_alive (ptid_t ptid)
 static char *
 inf_ttrace_pid_to_str (ptid_t ptid)
 {
-  if (inf_ttrace_num_lwps > 0)
-    {
-      pid_t pid = ptid_get_pid (ptid);
-      lwpid_t lwpid = ptid_get_lwp (ptid);
-      static char buf[128];
-
-      xsnprintf (buf, sizeof buf, "process %ld, lwp %ld",
-                (long)pid, (long)lwpid);
-      return buf;
-    }
+  pid_t pid = ptid_get_pid (ptid);
+  lwpid_t lwpid = ptid_get_lwp (ptid);
+  static char buf[128];
 
-  return normal_pid_to_str (ptid);
+  if (lwpid == 0)
+    xsnprintf (buf, sizeof buf, "process %ld",
+              (long) pid);
+  else
+    xsnprintf (buf, sizeof buf, "process %ld, lwp %ld",
+              (long) pid, (long) lwpid);
+  return buf;
 }
 \f