* fork-child.c (startup_inferior): Only set threads not-executing

after getting all the pending execs.  On TARGET_WAITKIND_IGNORE,
	keep waiting, don't resume.  On all other cases but
	TARGET_WAITKIND_SIGNALLED and TARGET_WAITKIND_EXITED, switch to
	the event ptid.
This commit is contained in:
Pedro Alves 2008-10-24 22:01:25 +00:00
parent b7c2dce4c2
commit 2e979b9404
2 changed files with 27 additions and 8 deletions

View file

@ -1,3 +1,11 @@
2008-10-24 Pedro Alves <pedro@codesourcery.com>
* fork-child.c (startup_inferior): Only set threads not-executing
after getting all the pending execs. On TARGET_WAITKIND_IGNORE,
keep waiting, don't resume. On all other cases but
TARGET_WAITKIND_SIGNALLED and TARGET_WAITKIND_EXITED, switch to
the event ptid.
2008-10-24 Pedro Alves <pedro@codesourcery.com> 2008-10-24 Pedro Alves <pedro@codesourcery.com>
Remote non-stop mode support. Remote non-stop mode support.

View file

@ -434,21 +434,18 @@ startup_inferior (int ntraps)
{ {
int resume_signal = TARGET_SIGNAL_0; int resume_signal = TARGET_SIGNAL_0;
ptid_t resume_ptid; ptid_t resume_ptid;
ptid_t event_ptid;
struct target_waitstatus ws; struct target_waitstatus ws;
memset (&ws, 0, sizeof (ws)); memset (&ws, 0, sizeof (ws));
resume_ptid = target_wait (pid_to_ptid (-1), &ws); event_ptid = target_wait (pid_to_ptid (-1), &ws);
/* Mark all threads non-executing. */ if (ws.kind == TARGET_WAITKIND_IGNORE)
set_executing (pid_to_ptid (-1), 0); /* The inferior didn't really stop, keep waiting. */
continue;
/* In all-stop mode, resume all threads. */
if (!non_stop)
resume_ptid = pid_to_ptid (-1);
switch (ws.kind) switch (ws.kind)
{ {
case TARGET_WAITKIND_IGNORE:
case TARGET_WAITKIND_SPURIOUS: case TARGET_WAITKIND_SPURIOUS:
case TARGET_WAITKIND_LOADED: case TARGET_WAITKIND_LOADED:
case TARGET_WAITKIND_FORKED: case TARGET_WAITKIND_FORKED:
@ -456,6 +453,7 @@ startup_inferior (int ntraps)
case TARGET_WAITKIND_SYSCALL_ENTRY: case TARGET_WAITKIND_SYSCALL_ENTRY:
case TARGET_WAITKIND_SYSCALL_RETURN: case TARGET_WAITKIND_SYSCALL_RETURN:
/* Ignore gracefully during startup of the inferior. */ /* Ignore gracefully during startup of the inferior. */
switch_to_thread (event_ptid);
break; break;
case TARGET_WAITKIND_SIGNALLED: case TARGET_WAITKIND_SIGNALLED:
@ -480,13 +478,21 @@ startup_inferior (int ntraps)
/* Handle EXEC signals as if they were SIGTRAP signals. */ /* Handle EXEC signals as if they were SIGTRAP signals. */
xfree (ws.value.execd_pathname); xfree (ws.value.execd_pathname);
resume_signal = TARGET_SIGNAL_TRAP; resume_signal = TARGET_SIGNAL_TRAP;
switch_to_thread (event_ptid);
break; break;
case TARGET_WAITKIND_STOPPED: case TARGET_WAITKIND_STOPPED:
resume_signal = ws.value.sig; resume_signal = ws.value.sig;
switch_to_thread (event_ptid);
break; break;
} }
/* In all-stop mode, resume all threads. */
if (!non_stop)
resume_ptid = pid_to_ptid (-1);
else
resume_ptid = event_ptid;
if (resume_signal != TARGET_SIGNAL_TRAP) if (resume_signal != TARGET_SIGNAL_TRAP)
{ {
/* Let shell child handle its own signals in its own way. */ /* Let shell child handle its own signals in its own way. */
@ -519,6 +525,11 @@ startup_inferior (int ntraps)
target_resume (resume_ptid, 0, TARGET_SIGNAL_0); target_resume (resume_ptid, 0, TARGET_SIGNAL_0);
} }
} }
/* Mark all threads non-executing. */
set_executing (pid_to_ptid (-1), 0);
stop_pc = read_pc ();
} }
/* Implement the "unset exec-wrapper" command. */ /* Implement the "unset exec-wrapper" command. */