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.
This commit is contained in:
Pedro Alves 2009-05-06 17:32:59 +00:00
parent a562dc8f5a
commit a6dbe5dfa5
3 changed files with 30 additions and 13 deletions

View File

@ -1,3 +1,15 @@
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> 2009-04-30 Doug Evans <dje@google.com>
* inferiors.c (started_inferior_callback): New function. * inferiors.c (started_inferior_callback): New function.

View File

@ -109,8 +109,6 @@ int stopping_threads;
/* FIXME make into a target method? */ /* FIXME make into a target method? */
int using_threads = 1; int using_threads = 1;
static int must_set_ptrace_flags;
/* This flag is true iff we've just created or attached to our first /* 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 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 to call the low target's arch_setup callback. Doing this only on
@ -319,7 +317,7 @@ add_lwp (ptid_t ptid)
static int static int
linux_create_inferior (char *program, char **allargs) linux_create_inferior (char *program, char **allargs)
{ {
void *new_lwp; struct lwp_info *new_lwp;
int pid; int pid;
ptid_t ptid; ptid_t ptid;
@ -354,7 +352,7 @@ linux_create_inferior (char *program, char **allargs)
ptid = ptid_build (pid, pid, 0); ptid = ptid_build (pid, pid, 0);
new_lwp = add_lwp (ptid); new_lwp = add_lwp (ptid);
add_thread (ptid, new_lwp); add_thread (ptid, new_lwp);
must_set_ptrace_flags = 1; new_lwp->must_set_ptrace_flags = 1;
return pid; return pid;
} }
@ -383,10 +381,6 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
strerror (errno), errno); strerror (errno), errno);
} }
/* FIXME: This intermittently fails.
We need to wait for SIGSTOP first. */
ptrace (PTRACE_SETOPTIONS, lwpid, 0, PTRACE_O_TRACECLONE);
if (initial) if (initial)
/* NOTE/FIXME: This lwp might have not been the tgid. */ /* NOTE/FIXME: This lwp might have not been the tgid. */
ptid = ptid_build (lwpid, lwpid, 0); ptid = ptid_build (lwpid, lwpid, 0);
@ -402,6 +396,11 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
new_lwp = (struct lwp_info *) add_lwp (ptid); new_lwp = (struct lwp_info *) add_lwp (ptid);
add_thread (ptid, new_lwp); 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 /* The next time we wait for this LWP we'll see a SIGSTOP as PTRACE_ATTACH
brings it to a halt. brings it to a halt.
@ -996,6 +995,13 @@ linux_wait_for_event_1 (ptid_t ptid, int *wstat, int options)
continue; 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) if (WIFSTOPPED (*wstat)
&& WSTOPSIG (*wstat) == SIGSTOP && WSTOPSIG (*wstat) == SIGSTOP
&& event_child->stop_expected) && event_child->stop_expected)
@ -1258,11 +1264,6 @@ retry:
lwp = get_thread_lwp (current_inferior); 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, /* If we are waiting for a particular child, and it exited,
linux_wait_for_event will return its exit status. Similarly if linux_wait_for_event will return its exit status. Similarly if
the last child exited. If this is not the last child, however, the last child exited. If this is not the last child, however,

View File

@ -146,6 +146,10 @@ struct lwp_info
was a single-step. */ was a single-step. */
int stepping; int stepping;
/* If this flag is set, we need to set the event request flags the
next time we see this LWP stop. */
int must_set_ptrace_flags;
/* If this is non-zero, it points to a chain of signals which need to /* If this is non-zero, it points to a chain of signals which need to
be delivered to this process. */ be delivered to this process. */
struct pending_signals *pending_signals; struct pending_signals *pending_signals;