diff options
author | Pedro Alves <palves@redhat.com> | 2008-10-24 22:01:25 +0000 |
---|---|---|
committer | Pedro Alves <palves@redhat.com> | 2008-10-24 22:01:25 +0000 |
commit | 2e979b9404414113dc61b32eebcda8a53632605c (patch) | |
tree | f56e1db2d9824cce3fcabc05fb17f9c02e512b11 /gdb/fork-child.c | |
parent | b7c2dce4c237f261779fdba82738fa4e504c2f89 (diff) | |
download | gdb-2e979b9404414113dc61b32eebcda8a53632605c.zip gdb-2e979b9404414113dc61b32eebcda8a53632605c.tar.gz gdb-2e979b9404414113dc61b32eebcda8a53632605c.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/fork-child.c')
-rw-r--r-- | gdb/fork-child.c | 27 |
1 files changed, 19 insertions, 8 deletions
diff --git a/gdb/fork-child.c b/gdb/fork-child.c index 86c5e91..ec6d8cf 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. */ |