aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/gdbserver/ChangeLog14
-rw-r--r--gdb/gdbserver/inferiors.c1
-rw-r--r--gdb/gdbserver/server.c36
-rw-r--r--gdb/gdbserver/server.h3
4 files changed, 35 insertions, 19 deletions
diff --git a/gdb/gdbserver/ChangeLog b/gdb/gdbserver/ChangeLog
index 20b3e1c..a11461d 100644
--- a/gdb/gdbserver/ChangeLog
+++ b/gdb/gdbserver/ChangeLog
@@ -1,5 +1,19 @@
2015-08-21 Pedro Alves <palves@redhat.com>
+ 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 <palves@redhat.com>
+
* linux-low.c (wait_for_sigstop): Always switch to no thread
selected if the previously current thread dies.
* lynx-low.c (lynx_request_interrupt): Use the first thread's
diff --git a/gdb/gdbserver/inferiors.c b/gdb/gdbserver/inferiors.c
index d7ad347..3659df1 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 58907ec..34fcd2b 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 9080151..6020d72 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"