aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Jacobowitz <drow@false.org>2007-10-24 13:27:01 +0000
committerDaniel Jacobowitz <drow@false.org>2007-10-24 13:27:01 +0000
commitda5898cee8b3506b9a6ad31e111bd43b095946a8 (patch)
tree8435472ddc300662a3f18b35462e130705082649
parent51432cca1367d4ff610ed2d7c3fa64ba335eaa15 (diff)
downloadgdb-da5898cee8b3506b9a6ad31e111bd43b095946a8.zip
gdb-da5898cee8b3506b9a6ad31e111bd43b095946a8.tar.gz
gdb-da5898cee8b3506b9a6ad31e111bd43b095946a8.tar.bz2
* linux-low.c (handle_extended_wait): Handle unexpected signals.
-rw-r--r--gdb/gdbserver/ChangeLog4
-rw-r--r--gdb/gdbserver/linux-low.c28
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