X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-notif.c;h=2e5f124284ba57265738a232803add4cb173c06a;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=ae9a94d9c944f68e271cd65c1ef3785d79ffa9fa;hpb=bb27775165d9b992120371383012404e213b1981;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-notif.c b/gdb/remote-notif.c index ae9a94d9c9..2e5f124284 100644 --- a/gdb/remote-notif.c +++ b/gdb/remote-notif.c @@ -1,6 +1,6 @@ /* Remote notification in GDB protocol - Copyright (C) 1988-2019 Free Software Foundation, Inc. + Copyright (C) 1988-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -35,13 +35,14 @@ #include "remote.h" #include "remote-notif.h" #include "observable.h" -#include "event-loop.h" +#include "gdbsupport/event-loop.h" #include "target.h" #include "inferior.h" #include "infrun.h" #include "gdbcmd.h" +#include "async-event.h" -int notif_debug = 0; +bool notif_debug = false; /* Supported clients of notifications. */ @@ -52,8 +53,6 @@ static struct notif_client *notifs[] = gdb_static_assert (ARRAY_SIZE (notifs) == REMOTE_NOTIF_LAST); -static void do_notif_event_xfree (void *arg); - /* Parse the BUF for the expected notification NC, and send packet to acknowledge. */ @@ -61,18 +60,14 @@ void remote_notif_ack (remote_target *remote, struct notif_client *nc, const char *buf) { - struct notif_event *event = nc->alloc_event (); - struct cleanup *old_chain - = make_cleanup (do_notif_event_xfree, event); + notif_event_up event = nc->alloc_event (); if (notif_debug) fprintf_unfiltered (gdb_stdlog, "notif: ack '%s'\n", nc->ack_command); - nc->parse (remote, nc, buf, event); - nc->ack (remote, nc, buf, event); - - discard_cleanups (old_chain); + nc->parse (remote, nc, buf, event.get ()); + nc->ack (remote, nc, buf, event.release ()); } /* Parse the BUF for the expected notification NC. */ @@ -81,21 +76,16 @@ struct notif_event * remote_notif_parse (remote_target *remote, struct notif_client *nc, const char *buf) { - struct notif_event *event = nc->alloc_event (); - struct cleanup *old_chain - = make_cleanup (do_notif_event_xfree, event); + notif_event_up event = nc->alloc_event (); if (notif_debug) fprintf_unfiltered (gdb_stdlog, "notif: parse '%s'\n", nc->name); - nc->parse (remote, nc, buf, event); + nc->parse (remote, nc, buf, event.get ()); - discard_cleanups (old_chain); - return event; + return event.release (); } -DEFINE_QUEUE_P (notif_client_p); - /* Process notifications in STATE's notification queue one by one. EXCEPT is not expected in the queue. */ @@ -103,10 +93,10 @@ void remote_notif_process (struct remote_notif_state *state, struct notif_client *except) { - while (!QUEUE_is_empty (notif_client_p, state->notif_queue)) + while (!state->notif_queue.empty ()) { - struct notif_client *nc = QUEUE_deque (notif_client_p, - state->notif_queue); + struct notif_client *nc = state->notif_queue.front (); + state->notif_queue.pop_front (); gdb_assert (nc != except); @@ -167,7 +157,7 @@ handle_notification (struct remote_notif_state *state, const char *buf) /* Notify the event loop there's a stop reply to acknowledge and that there may be more events to fetch. */ - QUEUE_enque (notif_client_p, state->notif_queue, nc); + state->notif_queue.push_back (nc); if (target_is_non_stop_p ()) { /* In non-stop, We mark REMOTE_ASYNC_GET_PENDING_EVENTS_TOKEN @@ -216,36 +206,15 @@ handle_notification (struct remote_notif_state *state, const char *buf) } } -/* Invoke destructor of EVENT and xfree it. */ - -void -notif_event_xfree (struct notif_event *event) -{ - if (event != NULL && event->dtr != NULL) - event->dtr (event); - - xfree (event); -} - -/* Cleanup wrapper. */ - -static void -do_notif_event_xfree (void *arg) -{ - notif_event_xfree ((struct notif_event *) arg); -} - /* Return an allocated remote_notif_state. */ struct remote_notif_state * remote_notif_state_allocate (remote_target *remote) { - struct remote_notif_state *notif_state = XCNEW (struct remote_notif_state); + struct remote_notif_state *notif_state = new struct remote_notif_state; notif_state->remote = remote; - notif_state->notif_queue = QUEUE_alloc (notif_client_p, NULL); - /* Register async_event_handler for notification. */ notif_state->get_pending_events_token @@ -257,25 +226,21 @@ remote_notif_state_allocate (remote_target *remote) /* Free STATE and its fields. */ -void -remote_notif_state_xfree (struct remote_notif_state *state) +remote_notif_state::~remote_notif_state () { int i; - QUEUE_free (notif_client_p, state->notif_queue); - /* Unregister async_event_handler for notification. */ - if (state->get_pending_events_token != NULL) - delete_async_event_handler (&state->get_pending_events_token); + if (get_pending_events_token != NULL) + delete_async_event_handler (&get_pending_events_token); for (i = 0; i < REMOTE_NOTIF_LAST; i++) - notif_event_xfree (state->pending_event[i]); - - xfree (state); + delete pending_event[i]; } +void _initialize_notif (); void -_initialize_notif (void) +_initialize_notif () { add_setshow_boolean_cmd ("notification", no_class, ¬if_debug, _("\