diff options
author | Daniel Jacobowitz <drow@false.org> | 2007-10-24 13:27:01 +0000 |
---|---|---|
committer | Daniel Jacobowitz <drow@false.org> | 2007-10-24 13:27:01 +0000 |
commit | da5898cee8b3506b9a6ad31e111bd43b095946a8 (patch) | |
tree | 8435472ddc300662a3f18b35462e130705082649 | |
parent | 51432cca1367d4ff610ed2d7c3fa64ba335eaa15 (diff) | |
download | gdb-da5898cee8b3506b9a6ad31e111bd43b095946a8.zip gdb-da5898cee8b3506b9a6ad31e111bd43b095946a8.tar.gz gdb-da5898cee8b3506b9a6ad31e111bd43b095946a8.tar.bz2 |
* linux-low.c (handle_extended_wait): Handle unexpected signals.
-rw-r--r-- | gdb/gdbserver/ChangeLog | 4 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 28 |
2 files changed, 28 insertions, 4 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 229e7b1..25455d7 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -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. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 93577b9..fb80020 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 |