PR server/10048
authorPedro Alves <palves@redhat.com>
Wed, 6 May 2009 17:32:59 +0000 (17:32 +0000)
committerPedro Alves <palves@redhat.com>
Wed, 6 May 2009 17:32:59 +0000 (17:32 +0000)
* 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.

gdb/gdbserver/ChangeLog
gdb/gdbserver/linux-low.c
gdb/gdbserver/linux-low.h

index d710f61ed8e5547ac9c188f090a29436d474fdb8..49a395dde7e4f1f4f6273127d5e6520f0cf46286 100644 (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>
 
        * inferiors.c (started_inferior_callback): New function.
index a6bad392c09ac75682fc8b3089047dc14e2ac53d..bf17904d7059dca03ef99ed943fca073b4f7e150 100644 (file)
@@ -109,8 +109,6 @@ int stopping_threads;
 /* 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
@@ -319,7 +317,7 @@ add_lwp (ptid_t ptid)
 static int
 linux_create_inferior (char *program, char **allargs)
 {
-  void *new_lwp;
+  struct lwp_info *new_lwp;
   int pid;
   ptid_t ptid;
 
@@ -354,7 +352,7 @@ linux_create_inferior (char *program, char **allargs)
   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;
 }
@@ -383,10 +381,6 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
               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);
@@ -402,6 +396,11 @@ linux_attach_lwp_1 (unsigned long lwpid, int initial)
   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.
 
@@ -996,6 +995,13 @@ linux_wait_for_event_1 (ptid_t ptid, int *wstat, int options)
          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)
@@ -1258,11 +1264,6 @@ retry:
 
   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,
index b076c5d87e1423fc40b7e1a33862fc46708d5ef0..fc93a0e491f93c880ff4d3a87bd345a61123ea87 100644 (file)
@@ -146,6 +146,10 @@ struct lwp_info
      was a single-step.  */
   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
      be delivered to this process.  */
   struct pending_signals *pending_signals;