mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 15:18:37 +08:00
remote.c/all-stop: Implement TARGET_WAITKIND_NO_RESUMED and TARGET_WNOHANG
Even though "target remote" supports target-async, the all-stop target_wait implementation ignores TARGET_WNOHANG. If the core happens to poll for events and we've already read the stop reply out of the serial/socket, remote_wait_as hangs forever instead of returning an indication that there are no events to process. This can't happen currently, but later changes will trigger this. gdb/ChangeLog: 2015-08-07 Pedro Alves <palves@redhat.com> * remote.c (remote_wait_as): If not waiting for a stop reply, return TARGET_WAITKIND_NO_RESUMED. If TARGET_WNOHANG is requested, don't block waiting forever.
This commit is contained in:
@ -1,3 +1,9 @@
|
|||||||
|
2015-08-07 Pedro Alves <palves@redhat.com>
|
||||||
|
|
||||||
|
* remote.c (remote_wait_as): If not waiting for a stop reply,
|
||||||
|
return TARGET_WAITKIND_NO_RESUMED. If TARGET_WNOHANG is
|
||||||
|
requested, don't block waiting forever.
|
||||||
|
|
||||||
2015-08-07 Pedro Alves <pedro@codesourcery.com>
|
2015-08-07 Pedro Alves <pedro@codesourcery.com>
|
||||||
|
|
||||||
* infrun.c (adjust_pc_after_break): Now takes thread_info and
|
* infrun.c (adjust_pc_after_break): Now takes thread_info and
|
||||||
|
13
gdb/remote.c
13
gdb/remote.c
@ -6267,6 +6267,14 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
|
|||||||
{
|
{
|
||||||
int ret;
|
int ret;
|
||||||
int is_notif;
|
int is_notif;
|
||||||
|
int forever = ((options & TARGET_WNOHANG) == 0
|
||||||
|
&& wait_forever_enabled_p);
|
||||||
|
|
||||||
|
if (!rs->waiting_for_stop_reply)
|
||||||
|
{
|
||||||
|
status->kind = TARGET_WAITKIND_NO_RESUMED;
|
||||||
|
return minus_one_ptid;
|
||||||
|
}
|
||||||
|
|
||||||
if (!target_is_async_p ())
|
if (!target_is_async_p ())
|
||||||
{
|
{
|
||||||
@ -6285,7 +6293,7 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
|
|||||||
However, before we do that we need to ensure that the caller
|
However, before we do that we need to ensure that the caller
|
||||||
knows how to take the target into/out of async mode. */
|
knows how to take the target into/out of async mode. */
|
||||||
ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
|
ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
|
||||||
wait_forever_enabled_p, &is_notif);
|
forever, &is_notif);
|
||||||
|
|
||||||
if (!target_is_async_p ())
|
if (!target_is_async_p ())
|
||||||
signal (SIGINT, ofunc);
|
signal (SIGINT, ofunc);
|
||||||
@ -6294,6 +6302,9 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
|
|||||||
not interesting. */
|
not interesting. */
|
||||||
if (ret != -1 && is_notif)
|
if (ret != -1 && is_notif)
|
||||||
return minus_one_ptid;
|
return minus_one_ptid;
|
||||||
|
|
||||||
|
if (ret == -1 && (options & TARGET_WNOHANG) != 0)
|
||||||
|
return minus_one_ptid;
|
||||||
}
|
}
|
||||||
|
|
||||||
buf = rs->buf;
|
buf = rs->buf;
|
||||||
|
Reference in New Issue
Block a user