From 2e979b9404414113dc61b32eebcda8a53632605c Mon Sep 17 00:00:00 2001 From: Pedro Alves Date: Fri, 24 Oct 2008 22:01:25 +0000 Subject: [PATCH] * 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/ChangeLog | 8 ++++++++ gdb/fork-child.c | 27 +++++++++++++++++++-------- 2 files changed, 27 insertions(+), 8 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index e4fec8733b3..3e807417e4e 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,11 @@ +2008-10-24 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. + 2008-10-24 Pedro Alves Remote non-stop mode support. diff --git a/gdb/fork-child.c b/gdb/fork-child.c index 86c5e911693..ec6d8cf8bc3 100644 --- a/gdb/fork-child.c +++ b/gdb/fork-child.c @@ -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,11 @@ startup_inferior (int ntraps) 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. */ -- 2.30.2