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>
+
Remote non-stop mode support.
* remote.c (pending_stop_reply): New.
{
int resume_signal = TARGET_SIGNAL_0;
ptid_t resume_ptid;
+ ptid_t event_ptid;
struct target_waitstatus 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. */
- set_executing (pid_to_ptid (-1), 0);
-
- /* In all-stop mode, resume all threads. */
- if (!non_stop)
- resume_ptid = pid_to_ptid (-1);
+ if (ws.kind == TARGET_WAITKIND_IGNORE)
+ /* The inferior didn't really stop, keep waiting. */
+ continue;
switch (ws.kind)
{
- case TARGET_WAITKIND_IGNORE:
case TARGET_WAITKIND_SPURIOUS:
case TARGET_WAITKIND_LOADED:
case TARGET_WAITKIND_FORKED:
case TARGET_WAITKIND_SYSCALL_ENTRY:
case TARGET_WAITKIND_SYSCALL_RETURN:
/* Ignore gracefully during startup of the inferior. */
+ switch_to_thread (event_ptid);
break;
case TARGET_WAITKIND_SIGNALLED:
/* Handle EXEC signals as if they were SIGTRAP signals. */
xfree (ws.value.execd_pathname);
resume_signal = TARGET_SIGNAL_TRAP;
+ switch_to_thread (event_ptid);
break;
case TARGET_WAITKIND_STOPPED:
resume_signal = ws.value.sig;
+ switch_to_thread (event_ptid);
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)
{
/* Let shell child handle its own signals in its own way. */
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. */