X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fremote-notif.h;h=328f81ec54f348064357f77184286e0cc3e01356;hb=refs%2Fheads%2Fconcurrent-displaced-stepping-2020-04-01;hp=98d7a30cab9f0926bfb3a836ed9f1506ac489c89;hpb=e2882c85786571175a0b0bfc3bcd2f14620b1ea3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/remote-notif.h b/gdb/remote-notif.h index 98d7a30cab..328f81ec54 100644 --- a/gdb/remote-notif.h +++ b/gdb/remote-notif.h @@ -1,6 +1,6 @@ /* Remote notification in GDB protocol - Copyright (C) 1988-2018 Free Software Foundation, Inc. + Copyright (C) 1988-2020 Free Software Foundation, Inc. This file is part of GDB. @@ -20,17 +20,22 @@ #ifndef REMOTE_NOTIF_H #define REMOTE_NOTIF_H -#include "queue.h" +#include +#include /* An event of a type of async remote notification. */ struct notif_event { - /* Destructor. Release everything from SELF, but not SELF - itself. */ - void (*dtr) (struct notif_event *self); + virtual ~notif_event () + { + } }; +/* A unique pointer holding a notif_event. */ + +typedef std::unique_ptr notif_event_up; + /* ID of the notif_client. */ enum REMOTE_NOTIF_ID @@ -39,9 +44,11 @@ enum REMOTE_NOTIF_ID REMOTE_NOTIF_LAST, }; +struct remote_target; + /* A client to a sort of async remote notification. */ -typedef struct notif_client +struct notif_client { /* The name of notification packet. */ const char *name; @@ -52,34 +59,43 @@ typedef struct notif_client /* Parse BUF to get the expected event and update EVENT. This function may throw exception if contents in BUF is not the expected event. */ - void (*parse) (struct notif_client *self, char *buf, + void (*parse) (remote_target *remote, + struct notif_client *self, const char *buf, struct notif_event *event); /* Send field to remote, and do some checking. If something wrong, throw an exception. */ - void (*ack) (struct notif_client *self, char *buf, + void (*ack) (remote_target *remote, + struct notif_client *self, const char *buf, struct notif_event *event); /* Check this notification client can get pending events in 'remote_notif_process'. */ - int (*can_get_pending_events) (struct notif_client *self); + int (*can_get_pending_events) (remote_target *remote, + struct notif_client *self); /* Allocate an event. */ - struct notif_event *(*alloc_event) (void); + notif_event_up (*alloc_event) (); /* Id of this notif_client. */ const enum REMOTE_NOTIF_ID id; -} *notif_client_p; - -DECLARE_QUEUE_P (notif_client_p); +}; /* State on remote async notification. */ struct remote_notif_state { + remote_notif_state () = default; + ~remote_notif_state (); + + DISABLE_COPY_AND_ASSIGN (remote_notif_state); + + /* The remote target. */ + remote_target *remote; + /* Notification queue. */ - QUEUE(notif_client_p) *notif_queue; + std::list notif_queue; /* Asynchronous signal handle registered as event loop source for when the remote sent us a notification. The registered callback @@ -88,32 +104,31 @@ struct remote_notif_state struct async_event_handler *get_pending_events_token; -/* One pending event for each notification client. This is where we - keep it until it is acknowledged. When there is a notification - packet, parse it, and create an object of 'struct notif_event' to - assign to it. This field is unchanged until GDB starts to ack - this notification (which is done by - remote.c:remote_notif_pending_replies). */ + /* One pending event for each notification client. This is where we + keep it until it is acknowledged. When there is a notification + packet, parse it, and create an object of 'struct notif_event' to + assign to it. This field is unchanged until GDB starts to ack + this notification (which is done by + remote.c:remote_notif_pending_replies). */ - struct notif_event *pending_event[REMOTE_NOTIF_LAST]; + struct notif_event *pending_event[REMOTE_NOTIF_LAST] {}; }; -void remote_notif_ack (struct notif_client *nc, char *buf); -struct notif_event *remote_notif_parse (struct notif_client *nc, - char *buf); - -void notif_event_xfree (struct notif_event *event); +void remote_notif_ack (remote_target *remote, notif_client *nc, + const char *buf); +struct notif_event *remote_notif_parse (remote_target *remote, + notif_client *nc, + const char *buf); void handle_notification (struct remote_notif_state *notif_state, - char *buf); + const char *buf); void remote_notif_process (struct remote_notif_state *state, struct notif_client *except); -struct remote_notif_state *remote_notif_state_allocate (void); -void remote_notif_state_xfree (struct remote_notif_state *state); +remote_notif_state *remote_notif_state_allocate (remote_target *remote); extern struct notif_client notif_client_stop; -extern int notif_debug; +extern bool notif_debug; #endif /* REMOTE_NOTIF_H */