diff options
author | Yao Qi <yao@codesourcery.com> | 2013-10-04 07:42:06 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2013-10-04 07:42:06 +0000 |
commit | f48ff2a7d3f69653dbf164e03d3397de8f6ba7c0 (patch) | |
tree | c865c15272902c555bae310d136f73eee5db53c7 /gdb/remote-notif.h | |
parent | 5965e02896b242f2ffe086def9c83a205eef31aa (diff) | |
download | gdb-f48ff2a7d3f69653dbf164e03d3397de8f6ba7c0.zip gdb-f48ff2a7d3f69653dbf164e03d3397de8f6ba7c0.tar.gz gdb-f48ff2a7d3f69653dbf164e03d3397de8f6ba7c0.tar.bz2 |
Move pending_event to remote_notif_state.
This patch moves pending_event to remote_notif_state. All pending
events are destroyed in remote_notif_state_xfree. However,
discard_pending_stop_replies release pending event too, so the pending
event of stop notification is released twice, we need some refactor
here. We add a new function discard_pending_stop_replies_in_queue
which only discard events in stop_reply_queue, and let
remote_notif_state_xfree release pending event for all notif_client.
After this change, discard_pending_stop_replies is only attached to
ifnerior_exit observer, so the INF can't be NULL any more. The
NULL checking is removed too.
gdb:
2013-10-04 Yao Qi <yao@codesourcery.com>
* remote-notif.h (REMOTE_NOTIF_ID): New enum.
(struct notif_client) <pending_event>: Moved
to struct remote_notif_state.
<id>: New field.
(struct remote_notif_state) <pending_event>: New field.
(notif_event_xfree): Declare.
* remote-notif.c (handle_notification): Adjust.
(notif_event_xfree): New function.
(do_notif_event_xfree): Call notif_event_xfree.
(remote_notif_state_xfree): Call notif_event_xfree to free
each element in field pending_event.
* remote.c (discard_pending_stop_replies): Remove declaration.
(discard_pending_stop_replies_in_queue): Declare.
(remote_close): Call discard_pending_stop_replies_in_queue
instead of discard_pending_stop_replies.
(remote_start_remote): Adjust.
(stop_reply_xfree): Call notif_event_xfree.
(notif_client_stop): Adjust initialization.
(remote_notif_remove_all): Rename it to ...
(remove_stop_reply_for_inferior): ... this. Update comments.
Don't check INF is NULL.
(discard_pending_stop_replies): Return early if notif_state is
NULL. Adjust. Don't check INF is NULL.
(remote_notif_get_pending_events): Adjust.
(discard_pending_stop_replies_in_queue): New function.
(remote_wait_ns): Likewise.
Diffstat (limited to 'gdb/remote-notif.h')
-rw-r--r-- | gdb/remote-notif.h | 28 |
1 files changed, 21 insertions, 7 deletions
diff --git a/gdb/remote-notif.h b/gdb/remote-notif.h index 4c3617e..e5ebbc7 100644 --- a/gdb/remote-notif.h +++ b/gdb/remote-notif.h @@ -31,6 +31,14 @@ struct notif_event void (*dtr) (struct notif_event *self); }; +/* ID of the notif_client. */ + +enum REMOTE_NOTIF_ID +{ + REMOTE_NOTIF_STOP = 0, + REMOTE_NOTIF_LAST, +}; + /* A client to a sort of async remote notification. */ typedef struct notif_client @@ -59,13 +67,8 @@ typedef struct notif_client /* Allocate an event. */ struct notif_event *(*alloc_event) (void); - /* One pending event. 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; + /* Id of this notif_client. */ + const enum REMOTE_NOTIF_ID id; } *notif_client_p; DECLARE_QUEUE_P (notif_client_p); @@ -84,12 +87,23 @@ struct remote_notif_state the remote side into our event queue. */ 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). */ + + 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 handle_notification (struct remote_notif_state *notif_state, char *buf); |