aboutsummaryrefslogtreecommitdiff
path: root/gdb/fork-child.c
diff options
context:
space:
mode:
authorPedro Alves <palves@redhat.com>2008-10-24 22:01:25 +0000
committerPedro Alves <palves@redhat.com>2008-10-24 22:01:25 +0000
commit2e979b9404414113dc61b32eebcda8a53632605c (patch)
treef56e1db2d9824cce3fcabc05fb17f9c02e512b11 /gdb/fork-child.c
parentb7c2dce4c237f261779fdba82738fa4e504c2f89 (diff)
downloadgdb-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.c27
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. */