diff options
author | Tom Tromey <tom@tromey.com> | 2019-04-07 16:17:40 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2019-04-19 14:29:32 -0600 |
commit | b494cdff6922944383ef4dc20fcc90c4d823d315 (patch) | |
tree | cb98e6f414bd464bc5edb3709c1554a39c30620d /gdb/gdbserver/server.c | |
parent | cf250e36790aaa255bb486e2122bb83c95c7669b (diff) | |
download | binutils-b494cdff6922944383ef4dc20fcc90c4d823d315.zip binutils-b494cdff6922944383ef4dc20fcc90c4d823d315.tar.gz binutils-b494cdff6922944383ef4dc20fcc90c4d823d315.tar.bz2 |
Use std::list for event notifications in gdbserver
This changes gdbserver to use std::list rather than common/queue.h for
event notifications.
gdb/gdbserver/ChangeLog
2019-04-19 Tom Tromey <tom@tromey.com>
* server.c (struct vstop_notif): Derive from notif_event.
<base>: Remove.
(queue_stop_reply): Update.
(remove_all_on_match_ptid): Change type. Rewrite.
(discard_queued_stop_replies): Rewrite.
(in_queued_stop_replies_ptid): Change type.
(in_queued_stop_replies): Rewrite.
(notif_stop): Update.
(queue_stop_reply_callback): Update.
(captured_main): Don't call initialize_notif.
(push_stop_notification): Update.
* notif.c (notif_write_event, handle_notif_ack)
(notif_event_enque, notif_push): Update.
(notif_event_xfree, initialize_notif): Remove.
* notif.h (struct notif_event): Include <list>, not
"common/queue.h".
(struct notif_server) <queue>: Now a std::list.
(notif_event_p): Remove typedef.
(initialize_notif): Don't declare.
(struct notif_event): Add virtual destructor.
Diffstat (limited to 'gdb/gdbserver/server.c')
-rw-r--r-- | gdb/gdbserver/server.c | 80 |
1 files changed, 37 insertions, 43 deletions
diff --git a/gdb/gdbserver/server.c b/gdb/gdbserver/server.c index 36510ad..fae5b24 100644 --- a/gdb/gdbserver/server.c +++ b/gdb/gdbserver/server.c @@ -140,10 +140,8 @@ static unsigned char *mem_buf; relative to a single stop reply. We keep a queue of these to push to GDB in non-stop mode. */ -struct vstop_notif +struct vstop_notif : public notif_event { - struct notif_event base; - /* Thread or process that got the event. */ ptid_t ptid; @@ -155,8 +153,6 @@ struct vstop_notif btrace configuration. */ static struct btrace_config current_btrace_conf; -DEFINE_QUEUE_P (notif_event_p); - /* The client remote protocol state. */ static client_state g_client_state; @@ -174,32 +170,20 @@ get_client_state () static void queue_stop_reply (ptid_t ptid, struct target_waitstatus *status) { - struct vstop_notif *new_notif = XNEW (struct vstop_notif); + struct vstop_notif *new_notif = new struct vstop_notif; new_notif->ptid = ptid; new_notif->status = *status; - notif_event_enque (¬if_stop, (struct notif_event *) new_notif); + notif_event_enque (¬if_stop, new_notif); } -static int -remove_all_on_match_ptid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +static bool +remove_all_on_match_ptid (struct notif_event *event, ptid_t filter_ptid) { - ptid_t filter_ptid = *(ptid_t *) data; struct vstop_notif *vstop_event = (struct vstop_notif *) event; - if (vstop_event->ptid.matches (filter_ptid)) - { - if (q->free_func != NULL) - q->free_func (event); - - QUEUE_remove_elem (notif_event_p, q, iter); - } - - return 1; + return vstop_event->ptid.matches (filter_ptid); } /* See server.h. */ @@ -207,8 +191,19 @@ remove_all_on_match_ptid (QUEUE (notif_event_p) *q, void discard_queued_stop_replies (ptid_t ptid) { - QUEUE_iterate (notif_event_p, notif_stop.queue, - remove_all_on_match_ptid, &ptid); + std::list<notif_event *>::iterator iter, next, end; + end = notif_stop.queue.end (); + for (iter = notif_stop.queue.begin (); iter != end; iter = next) + { + next = iter; + ++next; + + if (remove_all_on_match_ptid (*iter, ptid)) + { + delete *iter; + notif_stop.queue.erase (iter); + } + } } static void @@ -219,27 +214,23 @@ vstop_notif_reply (struct notif_event *event, char *own_buf) prepare_resume_reply (own_buf, vstop->ptid, &vstop->status); } -/* QUEUE_iterate callback helper for in_queued_stop_replies. */ +/* Helper for in_queued_stop_replies. */ -static int -in_queued_stop_replies_ptid (QUEUE (notif_event_p) *q, - QUEUE_ITER (notif_event_p) *iter, - struct notif_event *event, - void *data) +static bool +in_queued_stop_replies_ptid (struct notif_event *event, ptid_t filter_ptid) { - ptid_t filter_ptid = *(ptid_t *) data; struct vstop_notif *vstop_event = (struct vstop_notif *) event; if (vstop_event->ptid.matches (filter_ptid)) - return 0; + return true; /* Don't resume fork children that GDB does not know about yet. */ if ((vstop_event->status.kind == TARGET_WAITKIND_FORKED || vstop_event->status.kind == TARGET_WAITKIND_VFORKED) && vstop_event->status.value.related_pid.matches (filter_ptid)) - return 0; + return true; - return 1; + return false; } /* See server.h. */ @@ -247,13 +238,18 @@ in_queued_stop_replies_ptid (QUEUE (notif_event_p) *q, int in_queued_stop_replies (ptid_t ptid) { - return !QUEUE_iterate (notif_event_p, notif_stop.queue, - in_queued_stop_replies_ptid, &ptid); + for (notif_event *event : notif_stop.queue) + { + if (in_queued_stop_replies_ptid (event, ptid)) + return true; + } + + return false; } struct notif_server notif_stop = { - "vStopped", "Stop", NULL, vstop_notif_reply, + "vStopped", "Stop", {}, vstop_notif_reply, }; static int @@ -3247,14 +3243,13 @@ queue_stop_reply_callback (thread_info *thread) manage the thread's last_status field. */ if (the_target->thread_stopped == NULL) { - struct vstop_notif *new_notif = XNEW (struct vstop_notif); + struct vstop_notif *new_notif = new struct vstop_notif; new_notif->ptid = thread->id; new_notif->status = thread->last_status; /* Pass the last stop reply back to GDB, but don't notify yet. */ - notif_event_enque (¬if_stop, - (struct notif_event *) new_notif); + notif_event_enque (¬if_stop, new_notif); } else { @@ -3789,7 +3784,6 @@ captured_main (int argc, char *argv[]) initialize_event_loop (); if (target_supports_tracepoints ()) initialize_tracepoint (); - initialize_notif (); mem_buf = (unsigned char *) xmalloc (PBUFSIZ); @@ -4412,12 +4406,12 @@ handle_serial_event (int err, gdb_client_data client_data) static void push_stop_notification (ptid_t ptid, struct target_waitstatus *status) { - struct vstop_notif *vstop_notif = XNEW (struct vstop_notif); + struct vstop_notif *vstop_notif = new struct vstop_notif; vstop_notif->status = *status; vstop_notif->ptid = ptid; /* Push Stop notification. */ - notif_push (¬if_stop, (struct notif_event *) vstop_notif); + notif_push (¬if_stop, vstop_notif); } /* Event-loop callback for target events. */ |