2008-10-13 Pedro Alves * 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. --- gdb/fork-child.c | 30 ++++++++++++++++++++++-------- 1 file changed, 22 insertions(+), 8 deletions(-) Index: src/gdb/fork-child.c =================================================================== --- src.orig/gdb/fork-child.c 2008-10-13 18:34:10.000000000 +0100 +++ src/gdb/fork-child.c 2008-10-13 19:12:03.000000000 +0100 @@ -434,21 +434,18 @@ startup_inferior (int ntraps) { 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: @@ -456,6 +453,7 @@ startup_inferior (int ntraps) 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: @@ -480,13 +478,21 @@ startup_inferior (int ntraps) /* 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. */ @@ -519,6 +525,14 @@ startup_inferior (int ntraps) target_resume (resume_ptid, 0, TARGET_SIGNAL_0); } } + + /* Mark all threads non-executing. */ + set_executing (pid_to_ptid (-1), 0); + + /* we called switch_to_thread above when threads were still tagged + as `executing', which had the effect of avoiding to fetch the + shell's registers, hence stop_pc as well --- read it now. */ + stop_pc = read_pc (); } /* Implement the "unset exec-wrapper" command. */