From da5898cee8b3506b9a6ad31e111bd43b095946a8 Mon Sep 17 00:00:00 2001 From: Daniel Jacobowitz Date: Wed, 24 Oct 2007 13:27:01 +0000 Subject: [PATCH] * linux-low.c (handle_extended_wait): Handle unexpected signals. --- gdb/gdbserver/ChangeLog | 4 ++++ gdb/gdbserver/linux-low.c | 28 ++++++++++++++++++++++++---- 2 files changed, 28 insertions(+), 4 deletions(-) diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 229e7b144ed..25455d7f3b9 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,7 @@ +2007-10-24 Daniel Jacobowitz + + * linux-low.c (handle_extended_wait): Handle unexpected signals. + 2007-10-23 Daniel Jacobowitz * inferiors.c (change_inferior_id): Delete. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 93577b9a98f..fb8002088ef 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -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 -- 2.30.2