* linux-low.c (handle_extended_wait): Use linux_resume_one_lwp
authorDoug Evans <dje@google.com>
Sun, 24 May 2009 17:44:19 +0000 (17:44 +0000)
committerDoug Evans <dje@google.com>
Sun, 24 May 2009 17:44:19 +0000 (17:44 +0000)
to resume the newly created thread, don't call ptrace (PTRACE_CONT)
directly.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index f5f272f289c297a164fa5fbca9570581d593c210..472fc00635379d3cad12cbaa7301a5e6d7180bf9 100644 (file)
@@ -1,5 +1,9 @@
 2009-05-24  Doug Evans  <dje@google.com>
 
+       * linux-low.c (handle_extended_wait): Use linux_resume_one_lwp
+       to resume the newly created thread, don't call ptrace (PTRACE_CONT)
+       directly.
+
        * linux-low.c (get_stop_pc): Print pc if debug_threads.
        (check_removed_breakpoint, linux_wait_for_lwp): Ditto.
        (linux_resume_one_lwp): Ditto.
index f721737d2c36ebe536559cc5060438760d6de61c..9af9e6eeeecbadd9f66f8b1389c7773a0ff5cad1 100644 (file)
@@ -295,29 +295,32 @@ handle_extended_wait (struct lwp_info *event_child, int wstat)
       new_lwp = (struct lwp_info *) add_lwp (ptid);
       add_thread (ptid, new_lwp);
 
+      /* Either we're going to immediately resume the new thread
+        or leave it stopped.  linux_resume_one_lwp is a nop if it
+        thinks the thread is currently running, so set this first
+        before calling linux_resume_one_lwp.  */
+      new_lwp->stopped = 1;
+
       /* Normally we will get the pending SIGSTOP.  But in some cases
         we might get another signal delivered to the group first.
         If we do get another signal, be sure not to lose it.  */
       if (WSTOPSIG (status) == SIGSTOP)
        {
-         if (stopping_threads)
-           new_lwp->stopped = 1;
-         else
-           ptrace (PTRACE_CONT, new_pid, 0, 0);
+         if (! stopping_threads)
+           linux_resume_one_lwp (new_lwp, 0, 0, NULL);
        }
       else
        {
          new_lwp->stop_expected = 1;
          if (stopping_threads)
            {
-             new_lwp->stopped = 1;
              new_lwp->status_pending_p = 1;
              new_lwp->status_pending = status;
            }
          else
            /* Pass the signal on.  This is what GDB does - except
               shouldn't we really report it instead?  */
-           ptrace (PTRACE_CONT, new_pid, 0, WSTOPSIG (status));
+           linux_resume_one_lwp (new_lwp, 0, WSTOPSIG (status), NULL);
        }
 
       /* Always resume the current thread.  If we are stopping