diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog index 20b3e1c1c3..a11461ddb2 100644 --- a/gdb/gdbserver/ChangeLog +++ b/gdb/gdbserver/ChangeLog @@ -1,3 +1,17 @@ +2015-08-21 Pedro Alves + + PR gdb/18749 + * inferiors.c (remove_thread): Discard any pending stop reply for + this thread. + * server.c (remove_all_on_match_pid): Rename to ... + (remove_all_on_match_ptid): ... this. Work with a filter ptid + instead of a pid. + (discard_queued_stop_replies): Change parameter to a ptid. Now + extern. + (handle_v_kill, kill_inferior_callback, captured_main) + (process_serial_event): Adjust. + * server.h (discard_queued_stop_replies): Declare. + 2015-08-21 Pedro Alves * linux-low.c (wait_for_sigstop): Always switch to no thread diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c index d7ad347eee..3659df1439 100644 --- a/gdb/gdbserver/inferiors.c +++ b/gdb/gdbserver/inferiors.c @@ -165,6 +165,7 @@ remove_thread (struct thread_info *thread) if (thread->btrace != NULL) target_disable_btrace (thread->btrace); + discard_queued_stop_replies (ptid_of (thread)); remove_inferior (&all_threads, (struct inferior_list_entry *) thread); free_one_thread (&thread->entry); } diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 58907ec4a9..34fcd2b008 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -146,15 +146,15 @@ queue_stop_reply (ptid_t ptid, struct target_waitstatus *status) } static int -remove_all_on_match_pid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +remove_all_on_match_ptid (QUEUE (notif_event_p) *q, + QUEUE_ITER (notif_event_p) *iter, + struct notif_event *event, + void *data) { - int *pid = data; + ptid_t filter_ptid = *(ptid_t *) data; + struct vstop_notif *vstop_event = (struct vstop_notif *) event; - if (*pid == -1 - || ptid_get_pid (((struct vstop_notif *) event)->ptid) == *pid) + if (ptid_match (vstop_event->ptid, filter_ptid)) { if (q->free_func != NULL) q->free_func (event); @@ -165,14 +165,13 @@ remove_all_on_match_pid (QUEUE (notif_event_p) *q, return 1; } -/* Get rid of the currently pending stop replies for PID. If PID is - -1, then apply to all processes. */ +/* See server.h. */ -static void -discard_queued_stop_replies (int pid) +void +discard_queued_stop_replies (ptid_t ptid) { QUEUE_iterate (notif_event_p, notif_stop.queue, - remove_all_on_match_pid, &pid); + remove_all_on_match_ptid, &ptid); } static void @@ -2784,7 +2783,7 @@ handle_v_kill (char *own_buf) last_status.kind = TARGET_WAITKIND_SIGNALLED; last_status.value.sig = GDB_SIGNAL_KILL; last_ptid = pid_to_ptid (pid); - discard_queued_stop_replies (pid); + discard_queued_stop_replies (last_ptid); write_ok (own_buf); return 1; } @@ -3211,7 +3210,7 @@ kill_inferior_callback (struct inferior_list_entry *entry) int pid = ptid_get_pid (process->entry.id); kill_inferior (pid); - discard_queued_stop_replies (pid); + discard_queued_stop_replies (pid_to_ptid (pid)); } /* Callback for for_each_inferior to detach or kill the inferior, @@ -3230,7 +3229,7 @@ detach_or_kill_inferior_callback (struct inferior_list_entry *entry) else kill_inferior (pid); - discard_queued_stop_replies (pid); + discard_queued_stop_replies (pid_to_ptid (pid)); } /* for_each_inferior callback for detach_or_kill_for_exit to print @@ -3487,6 +3486,7 @@ captured_main (int argc, char *argv[]) initialize_event_loop (); if (target_supports_tracepoints ()) initialize_tracepoint (); + initialize_notif (); own_buf = xmalloc (PBUFSIZ + 1); mem_buf = xmalloc (PBUFSIZ); @@ -3523,8 +3523,6 @@ captured_main (int argc, char *argv[]) } make_cleanup (detach_or_kill_for_exit_cleanup, NULL); - initialize_notif (); - /* Don't report shared library events on the initial connection, even if some libraries are preloaded. Avoids the "stopped by shared library event" notice on gdb side. */ @@ -3575,7 +3573,7 @@ captured_main (int argc, char *argv[]) /* Get rid of any pending statuses. An eventual reconnection (by the same GDB instance or another) will refresh all its state from scratch. */ - discard_queued_stop_replies (-1); + discard_queued_stop_replies (minus_one_ptid); for_each_inferior (&all_threads, clear_pending_status_callback); @@ -3823,7 +3821,7 @@ process_serial_event (void) write_enn (own_buf); else { - discard_queued_stop_replies (pid); + discard_queued_stop_replies (pid_to_ptid (pid)); write_ok (own_buf); if (extended_protocol) diff --git a/gdb/gdbserver/server.h b/gdb/gdbserver/server.h index 9080151dd9..6020d7206d 100644 --- a/gdb/gdbserver/server.h +++ b/gdb/gdbserver/server.h @@ -115,6 +115,9 @@ typedef int gdb_fildes_t; extern int handle_serial_event (int err, gdb_client_data client_data); extern int handle_target_event (int err, gdb_client_data client_data); +/* Get rid of the currently pending stop replies that match PTID. */ +extern void discard_queued_stop_replies (ptid_t ptid); + #include "remote-utils.h" #include "utils.h"