forked from Imagelibrary/binutils-gdb
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:
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 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 ())
|
||||
{
|
||||
@@ -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
|
||||
knows how to take the target into/out of async mode. */
|
||||
ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
|
||||
wait_forever_enabled_p, &is_notif);
|
||||
forever, &is_notif);
|
||||
|
||||
if (!target_is_async_p ())
|
||||
signal (SIGINT, ofunc);
|
||||
@@ -6294,6 +6302,9 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
|
||||
not interesting. */
|
||||
if (ret != -1 && is_notif)
|
||||
return minus_one_ptid;
|
||||
|
||||
if (ret == -1 && (options & TARGET_WNOHANG) != 0)
|
||||
return minus_one_ptid;
|
||||
}
|
||||
|
||||
buf = rs->buf;
|
||||
|
||||
Reference in New Issue
Block a user