diff options
Diffstat (limited to 'gdb/gdbserver/server.c')
-rw-r--r-- | gdb/gdbserver/server.c | 42 |
1 files changed, 38 insertions, 4 deletions
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) { |