+2009-05-06 Pedro Alves <pedro@codesourcery.com>
+
+ PR server/10048
+
+ * linux-low.c (must_set_ptrace_flags): Delete.
+ (linux_create_inferior): Set `lwp->must_set_ptrace_flags' instead
+ of the global.
+ (linux_attach_lwp_1): Don't set PTRACE_SETOPTIONS here. Set
+ `lwp->must_set_ptrace_flags' instead.
+ (linux_wait_for_event_1): If ptrace options here.
+ (linux_wait_1): ... not here.
+
2009-04-30 Doug Evans <dje@google.com>
* inferiors.c (started_inferior_callback): New function.
/* FIXME make into a target method? */
int using_threads = 1;
-static int must_set_ptrace_flags;
-
/* This flag is true iff we've just created or attached to our first
inferior but it has not stopped yet. As soon as it does, we need
to call the low target's arch_setup callback. Doing this only on
static int
linux_create_inferior (char *program, char **allargs)
{
- void *new_lwp;
+ struct lwp_info *new_lwp;
int pid;
ptid_t ptid;
ptid = ptid_build (pid, pid, 0);
new_lwp = add_lwp (ptid);
add_thread (ptid, new_lwp);
- must_set_ptrace_flags = 1;
+ new_lwp->must_set_ptrace_flags = 1;
return pid;
}
strerror (errno), errno);
}
- /* FIXME: This intermittently fails.
- We need to wait for SIGSTOP first. */
- ptrace (PTRACE_SETOPTIONS, lwpid, 0, PTRACE_O_TRACECLONE);
-
if (initial)
/* NOTE/FIXME: This lwp might have not been the tgid. */
ptid = ptid_build (lwpid, lwpid, 0);
new_lwp = (struct lwp_info *) add_lwp (ptid);
add_thread (ptid, new_lwp);
+
+ /* We need to wait for SIGSTOP before being able to make the next
+ ptrace call on this LWP. */
+ new_lwp->must_set_ptrace_flags = 1;
+
/* The next time we wait for this LWP we'll see a SIGSTOP as PTRACE_ATTACH
brings it to a halt.
continue;
}
+ if (event_child->must_set_ptrace_flags)
+ {
+ ptrace (PTRACE_SETOPTIONS, lwpid_of (event_child),
+ 0, PTRACE_O_TRACECLONE);
+ event_child->must_set_ptrace_flags = 0;
+ }
+
if (WIFSTOPPED (*wstat)
&& WSTOPSIG (*wstat) == SIGSTOP
&& event_child->stop_expected)
lwp = get_thread_lwp (current_inferior);
- if (must_set_ptrace_flags)
- {
- ptrace (PTRACE_SETOPTIONS, lwpid_of (lwp), 0, PTRACE_O_TRACECLONE);
- must_set_ptrace_flags = 0;
- }
/* If we are waiting for a particular child, and it exited,
linux_wait_for_event will return its exit status. Similarly if
the last child exited. If this is not the last child, however,