diff options
-rw-r--r-- | gdb/gdbserver/ChangeLog | 9 | ||||
-rw-r--r-- | gdb/gdbserver/linux-low.c | 3 | ||||
-rw-r--r-- | gdb/gdbserver/server.c | 42 |
3 files changed, 47 insertions, 7 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 6e6127e..f138ec6 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,5 +1,14 @@ 2010-08-25 Pedro Alves <pedro@codesourcery.com> + * linux-low.c (linux_wait_1): Don't set last_status here. + * server.c (push_event, queue_stop_reply_callback): Assert we're + not pushing a TARGET_WAITKIND_IGNORE event. + (start_inferior, start_inferior, attach_inferior, handle_v_cont) + (myresume, handle_target_event): Set the thread's last_resume_kind + and last_status from the target returned status. + +2010-08-25 Pedro Alves <pedro@codesourcery.com> + PR threads/10729 * linux-x86-low.c (update_debug_registers_callback): New. diff --git a/gdb/gdbserver/linux-low.c b/gdb/gdbserver/linux-low.c index 22d8eb1..b92e987 100644 --- a/gdb/gdbserver/linux-low.c +++ b/gdb/gdbserver/linux-low.c @@ -2391,9 +2391,6 @@ Check if we're already there.\n", ourstatus->kind, ourstatus->value.sig); - if (!stabilizing_threads) - current_inferior->last_status = *ourstatus; - return ptid_of (event_child); } diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 5292034..9e87b20 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -158,6 +158,8 @@ queue_stop_reply (ptid_t ptid, struct target_waitstatus *status) void push_event (ptid_t ptid, struct target_waitstatus *status) { + gdb_assert (status->kind != TARGET_WAITKIND_IGNORE); + queue_stop_reply (ptid, status); /* If this is the first stop reply in the queue, then inform GDB @@ -292,9 +294,14 @@ start_inferior (char **argv) mywait (pid_to_ptid (signal_pid), &last_status, 0, 0); if (last_status.kind != TARGET_WAITKIND_STOPPED) return signal_pid; + + current_inferior->last_resume_kind = resume_stop; + current_inferior->last_status = last_status; } while (last_status.value.sig != TARGET_SIGNAL_TRAP); + current_inferior->last_resume_kind = resume_stop; + current_inferior->last_status = last_status; return signal_pid; } @@ -302,6 +309,13 @@ start_inferior (char **argv) (assuming success). */ last_ptid = mywait (pid_to_ptid (signal_pid), &last_status, 0, 0); + if (last_status.kind != TARGET_WAITKIND_EXITED + && last_status.kind != TARGET_WAITKIND_SIGNALLED) + { + current_inferior->last_resume_kind = resume_stop; + current_inferior->last_status = last_status; + } + return signal_pid; } @@ -332,6 +346,9 @@ attach_inferior (int pid) if (last_status.kind == TARGET_WAITKIND_STOPPED && last_status.value.sig == TARGET_SIGNAL_STOP) last_status.value.sig = TARGET_SIGNAL_TRAP; + + current_inferior->last_resume_kind = resume_stop; + current_inferior->last_status = last_status; } return 0; @@ -1780,6 +1797,10 @@ handle_v_cont (char *own_buf) { last_ptid = mywait (minus_one_ptid, &last_status, 0, 1); + if (last_status.kind != TARGET_WAITKIND_EXITED + && last_status.kind != TARGET_WAITKIND_SIGNALLED) + current_inferior->last_status = last_status; + /* From the client's perspective, all-stop mode always stops all threads implicitly (and the target backend has already done so by now). Tag all threads as "want-stopped", so we don't @@ -2089,6 +2110,14 @@ myresume (char *own_buf, int step, int sig) else { last_ptid = mywait (minus_one_ptid, &last_status, 0, 1); + + if (last_status.kind != TARGET_WAITKIND_EXITED + && last_status.kind != TARGET_WAITKIND_SIGNALLED) + { + current_inferior->last_resume_kind = resume_stop; + current_inferior->last_status = last_status; + } + prepare_resume_reply (own_buf, last_ptid, &last_status); disable_async_io (); @@ -2128,6 +2157,8 @@ queue_stop_reply_callback (struct inferior_list_entry *entry, void *arg) target_pid_to_str (entry->id), target_waitstatus_to_string (&thread->last_status)); + gdb_assert (thread->last_status.kind != TARGET_WAITKIND_IGNORE); + /* Pass the last stop reply back to GDB, but don't notify yet. */ queue_stop_reply (entry->id, &thread->last_status); @@ -3135,10 +3166,13 @@ handle_target_event (int err, gdb_client_data client_data) mourn_inferior (process); } else - /* We're reporting this thread as stopped. Update it's - "want-stopped" state to what the client wants, until it gets - a new resume action. */ - gdb_wants_thread_stopped (¤t_inferior->entry); + { + /* We're reporting this thread as stopped. Update its + "want-stopped" state to what the client wants, until it + gets a new resume action. */ + current_inferior->last_resume_kind = resume_stop; + current_inferior->last_status = last_status; + } if (forward_event) { |