* linux-low.c (handle_extended_wait): Handle unexpected signals.
authorDaniel Jacobowitz <drow@false.org>
Wed, 24 Oct 2007 13:27:01 +0000 (13:27 +0000)
committerDaniel Jacobowitz <drow@false.org>
Wed, 24 Oct 2007 13:27:01 +0000 (13:27 +0000)
gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c

index 229e7b144edf597ca3438a1e6b6fac7ab8a7df5a..25455d7f3b9d8de2ac777f07e4ab4fb8806a481d 100644 (file)
@@ -1,3 +1,7 @@
+2007-10-24  Daniel Jacobowitz  <dan@codesourcery.com>
+
+       * linux-low.c (handle_extended_wait): Handle unexpected signals.
+
 2007-10-23  Daniel Jacobowitz  <dan@codesourcery.com>
 
        * inferiors.c (change_inferior_id): Delete.
index 93577b9a98ff1e7e05e073d994fb353b27fe3dd2..fb8002088efb035a4abc8754b8c7fb809d7892a5 100644 (file)
@@ -160,7 +160,7 @@ handle_extended_wait (struct process_info *event_child, int wstat)
            perror_with_name ("waiting for new child");
          else if (ret != new_pid)
            warning ("wait returned unexpected PID %d", ret);
-         else if (!WIFSTOPPED (status) || WSTOPSIG (status) != SIGSTOP)
+         else if (!WIFSTOPPED (status))
            warning ("wait returned unexpected status 0x%x", status);
        }
 
@@ -170,10 +170,30 @@ handle_extended_wait (struct process_info *event_child, int wstat)
       add_thread (new_pid, new_process, new_pid);
       new_thread_notify (thread_id_to_gdb_id (new_process->lwpid));
 
-      if (stopping_threads)
-       new_process->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, be sure not to lose it.  */
+      if (WSTOPSIG (status) == SIGSTOP)
+       {
+         if (stopping_threads)
+           new_process->stopped = 1;
+         else
+           ptrace (PTRACE_CONT, new_pid, 0, 0);
+       }
       else
-       ptrace (PTRACE_CONT, new_pid, 0, 0);
+       {
+         new_process->stop_expected = 1;
+         if (stopping_threads)
+           {
+             new_process->stopped = 1;
+             new_process->status_pending_p = 1;
+             new_process->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));
+       }
 
       /* Always resume the current thread.  If we are stopping
         threads, it will have a pending SIGSTOP; we may as well