This is the mail archive of the
gdb-patches@sourceware.org
mailing list for the GDB project.
Unbreak the Hurd (switch to the event ptid in fork-child.c)
- From: Pedro Alves <pedro at codesourcery dot com>
- To: gdb-patches at sourceware dot org
- Date: Wed, 15 Oct 2008 23:23:27 +0100
- Subject: Unbreak the Hurd (switch to the event ptid in fork-child.c)
As discussed in this thread:
http://sourceware.org/ml/gdb/2008-10/msg00061.html
If there are no more comments on this, I'll check it in tomorrow
or so.
--
Pedro Alves
2008-10-15 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.
---
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-15 23:22:27.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. */