diff options
author | Yao Qi <yao@codesourcery.com> | 2013-10-11 02:54:44 +0000 |
---|---|---|
committer | Yao Qi <yao@codesourcery.com> | 2013-10-11 02:54:44 +0000 |
commit | bcc75809a45a6ec06401e3963a021ef9ab778487 (patch) | |
tree | d865e28e4d92ac74847c482b8052c6645a9c9fc9 /gdb | |
parent | 848e5d082d07c1aba6abe59fccbf32e761e25d19 (diff) | |
download | gdb-bcc75809a45a6ec06401e3963a021ef9ab778487.zip gdb-bcc75809a45a6ec06401e3963a021ef9ab778487.tar.gz gdb-bcc75809a45a6ec06401e3963a021ef9ab778487.tar.bz2 |
gdb/
* remote.c (discard_pending_stop_replies_in_queue): Update
declaration.
(struct stop_reply) <rs>: New field.
(remove_stop_reply_of_remote_state): New function.
(discard_pending_stop_replies_in_queue): Add parameter 'rs'.
Callers update. Pass remove_stop_reply_of_remote_state to
QUEUE_iterate.
(remote_parse_stop_reply): Initialize field 'rs'.
Diffstat (limited to 'gdb')
-rw-r--r-- | gdb/ChangeLog | 11 | ||||
-rw-r--r-- | gdb/remote.c | 39 |
2 files changed, 44 insertions, 6 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 7a41967..3983447 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2013-10-11 Yao Qi <yao@codesourcery.com> + + * remote.c (discard_pending_stop_replies_in_queue): Update + declaration. + (struct stop_reply) <rs>: New field. + (remove_stop_reply_of_remote_state): New function. + (discard_pending_stop_replies_in_queue): Add parameter 'rs'. + Callers update. Pass remove_stop_reply_of_remote_state to + QUEUE_iterate. + (remote_parse_stop_reply): Initialize field 'rs'. + 2013-10-10 Will Newton <will.newton@linaro.org> * aarch64-linux-tdep.c (aarch64_linux_init_abi): Call diff --git a/gdb/remote.c b/gdb/remote.c index 60086d2..af3eac5 100644 --- a/gdb/remote.c +++ b/gdb/remote.c @@ -220,7 +220,7 @@ struct stop_reply; static void stop_reply_xfree (struct stop_reply *); static void remote_parse_stop_reply (char *, struct stop_reply *); static void push_stop_reply (struct stop_reply *); -static void discard_pending_stop_replies_in_queue (void); +static void discard_pending_stop_replies_in_queue (struct remote_state *); static int peek_stop_reply (ptid_t ptid); static void remote_async_inferior_event_handler (gdb_client_data); @@ -3069,7 +3069,7 @@ remote_close (void) /* We are closing the remote target, so we should discard everything of this target. */ - discard_pending_stop_replies_in_queue (); + discard_pending_stop_replies_in_queue (rs); if (remote_async_inferior_event_token) delete_async_event_handler (&remote_async_inferior_event_token); @@ -5274,6 +5274,11 @@ typedef struct stop_reply /* The identifier of the thread about this event */ ptid_t ptid; + /* The remote state this event associated is with. When the remote + connection, represented by a remote_state object, is closed, + all the associated stop_reply events should be released. */ + struct remote_state *rs; + struct target_waitstatus ws; /* Expedited registers. This makes remote debugging a bit more @@ -5434,19 +5439,40 @@ discard_pending_stop_replies (struct inferior *inf) remove_stop_reply_for_inferior, ¶m); } -/* Discard the stop replies in stop_reply_queue. */ +/* If its remote state is equal to the given remote state, + remove EVENT from the stop reply queue. */ + +static int +remove_stop_reply_of_remote_state (QUEUE (stop_reply_p) *q, + QUEUE_ITER (stop_reply_p) *iter, + stop_reply_p event, + void *data) +{ + struct queue_iter_param *param = data; + struct remote_state *rs = param->input; + + if (event->rs == rs) + { + stop_reply_xfree (event); + QUEUE_remove_elem (stop_reply_p, q, iter); + } + + return 1; +} + +/* Discard the stop replies for RS in stop_reply_queue. */ static void -discard_pending_stop_replies_in_queue (void) +discard_pending_stop_replies_in_queue (struct remote_state *rs) { struct queue_iter_param param; - param.input = NULL; + param.input = rs; param.output = NULL; /* Discard the stop replies we have already pulled with vStopped. */ QUEUE_iterate (stop_reply_p, stop_reply_queue, - remove_stop_reply_for_inferior, ¶m); + remove_stop_reply_of_remote_state, ¶m); } /* A parameter to pass data in and out. */ @@ -5559,6 +5585,7 @@ remote_parse_stop_reply (char *buf, struct stop_reply *event) char *p; event->ptid = null_ptid; + event->rs = get_remote_state (); event->ws.kind = TARGET_WAITKIND_IGNORE; event->ws.value.integer = 0; event->stopped_by_watchpoint_p = 0; |