forked from Imagelibrary/binutils-gdb
* target.h (TARGET_WNOHANG): New.
* target.c (target_wait): Add `options' argument. Adjust. (struct target_ops) <to_wait>: Add `options' argument. (target_wait): Add `options' argument. * infrun.c (wait_for_inferior): Pass 0 as options to target_wait (blocking wait). (fetch_inferior_event): Pass TARGET_WNOHANG as options to target_wait. * fork-child.c (startup_inferior): Pass 0 as options to target_wait (blocking wait). * linux-nat.c (linux_nat_create_inferior): Remove async masking. (linux_nat_wait_1): Add `target_options' argument. Use it instead of checking on target_can_async_p. (linux_nat_wait): Add `target_options' argument. Adjust. * remote.c (remote_wait_ns): Add `options' argument. Adjust to check on TARGET_WNOWAIT instead of checking on remote_is_async_p. (remote_wait_as): Add `options' argument. Adjust to check on TARGET_WNOWAIT instead of checking on remote_is_async_p. If doing a blocking wait, keep waiting until an interesting event comes out. (remote_wait): Add `options' argument. Don't loop here if the target is in async mode, and a blocking wait has been requested. * top.c (deprecated_target_wait_hook): Add `options' argument. * linux-thread-db.c (thread_db_wait): Add `options' argument, and pass it down to the layer beneath. * inf-ptrace.c (inf_ptrace_wait): Add `options' argument. * record.c (record_beneath_to_wait): Add `options' argument. (record_wait): Add `options' argument, and pass it down to the layer beneath. * bsd-uthread.c (bsd_uthread_wait): Add `options' argument. * darwin-nat.c (darwin_wait): Likewise. * defs.h (deprecated_target_wait_hook): Likewise. * gnu-nat.c (gnu_wait): Add `options' argument. * go32-nat.c (go32_wait): Likewise. * hpux-thread.c (hpux_thread_wait): Add `options' argument, and pass it down to the layer beneath. * inf-ttrace.c (inf_ttrace_wait): Add `options' argument. * monitor.c (monitor_wait): Likewise. * nto-procfs.c (procfs_wait): Likewise. * remote-mips.c (mips_wait): Add `options' argument. * remote-sim.c (gdbsim_wait): Likewise. * rs6000-nat.c (rs6000_wait): Add `options' argument. * sol-thread.c (sol_thread_wait): Add `options' argument, and pass it down to the layer beneath. * spu-linux-nat.c (spu_child_wait): Add `options' argument. * windows-nat.c (windows_wait): Likewise. * tui/tui-hooks.c (tui_target_wait_hook): Likewise. Adjust.
This commit is contained in:
39
gdb/remote.c
39
gdb/remote.c
@@ -4646,7 +4646,7 @@ process_stop_reply (struct stop_reply *stop_reply,
|
||||
/* The non-stop mode version of target_wait. */
|
||||
|
||||
static ptid_t
|
||||
remote_wait_ns (ptid_t ptid, struct target_waitstatus *status)
|
||||
remote_wait_ns (ptid_t ptid, struct target_waitstatus *status, int options)
|
||||
{
|
||||
struct remote_state *rs = get_remote_state ();
|
||||
struct remote_arch_state *rsa = get_remote_arch_state ();
|
||||
@@ -4688,16 +4688,15 @@ remote_wait_ns (ptid_t ptid, struct target_waitstatus *status)
|
||||
if (stop_reply != NULL)
|
||||
return process_stop_reply (stop_reply, status);
|
||||
|
||||
/* Still no event. If we're in asynchronous mode, then just
|
||||
/* Still no event. If we're just polling for an event, then
|
||||
return to the event loop. */
|
||||
if (remote_is_async_p ())
|
||||
if (options & TARGET_WNOHANG)
|
||||
{
|
||||
status->kind = TARGET_WAITKIND_IGNORE;
|
||||
return minus_one_ptid;
|
||||
}
|
||||
|
||||
/* Otherwise, asynchronous mode is masked, so do a blocking
|
||||
wait. */
|
||||
/* Otherwise do a blocking wait. */
|
||||
ret = getpkt_or_notif_sane (&rs->buf, &rs->buf_size,
|
||||
1 /* forever */);
|
||||
}
|
||||
@@ -4707,7 +4706,7 @@ remote_wait_ns (ptid_t ptid, struct target_waitstatus *status)
|
||||
STATUS just as `wait' would. */
|
||||
|
||||
static ptid_t
|
||||
remote_wait_as (ptid_t ptid, struct target_waitstatus *status)
|
||||
remote_wait_as (ptid_t ptid, struct target_waitstatus *status, int options)
|
||||
{
|
||||
struct remote_state *rs = get_remote_state ();
|
||||
struct remote_arch_state *rsa = get_remote_arch_state ();
|
||||
@@ -4717,6 +4716,8 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status)
|
||||
char *buf, *p;
|
||||
struct stop_reply *stop_reply;
|
||||
|
||||
again:
|
||||
|
||||
status->kind = TARGET_WAITKIND_IGNORE;
|
||||
status->value.integer = 0;
|
||||
|
||||
@@ -4819,8 +4820,14 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status)
|
||||
}
|
||||
|
||||
if (status->kind == TARGET_WAITKIND_IGNORE)
|
||||
/* Nothing interesting happened. */
|
||||
return minus_one_ptid;
|
||||
{
|
||||
/* Nothing interesting happened. If we're doing a non-blocking
|
||||
poll, we're done. Otherwise, go back to waiting. */
|
||||
if (options & TARGET_WNOHANG)
|
||||
return minus_one_ptid;
|
||||
else
|
||||
goto again;
|
||||
}
|
||||
else if (status->kind != TARGET_WAITKIND_EXITED
|
||||
&& status->kind != TARGET_WAITKIND_SIGNALLED)
|
||||
{
|
||||
@@ -4841,24 +4848,14 @@ remote_wait_as (ptid_t ptid, struct target_waitstatus *status)
|
||||
|
||||
static ptid_t
|
||||
remote_wait (struct target_ops *ops,
|
||||
ptid_t ptid, struct target_waitstatus *status)
|
||||
ptid_t ptid, struct target_waitstatus *status, int options)
|
||||
{
|
||||
ptid_t event_ptid;
|
||||
|
||||
if (non_stop)
|
||||
event_ptid = remote_wait_ns (ptid, status);
|
||||
event_ptid = remote_wait_ns (ptid, status, options);
|
||||
else
|
||||
{
|
||||
/* In synchronous mode, keep waiting until the target stops. In
|
||||
asynchronous mode, always return to the event loop. */
|
||||
|
||||
do
|
||||
{
|
||||
event_ptid = remote_wait_as (ptid, status);
|
||||
}
|
||||
while (status->kind == TARGET_WAITKIND_IGNORE
|
||||
&& !target_can_async_p ());
|
||||
}
|
||||
event_ptid = remote_wait_as (ptid, status, options);
|
||||
|
||||
if (target_can_async_p ())
|
||||
{
|
||||
|
||||
Reference in New Issue
Block a user