This is the mail archive of the gdb@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Does HEAD support non-stop with 'gdbserver --multi' on Linux?


On Thursday 30 April 2009 21:18:58, Marc Khouzam wrote:

> > What exactly are you seeing?  I just run a few non-stop test
> > (mi-nonstop.exp, mi-nsintrall.exp and ns-nsmoribund.exp tests)
> > against linux x86-64 gdbserver head, and they passed cleanly for
> > me, so *something* is working.  :-)
> 
> It seems no new thread is listed by GDB.

Hmmm, that should work.  This looks like another manifestation
of PR threads/10048.  Does this make a difference?

-- 
Pedro Alves

2009-04-30  Pedro Alves  <pedro@codesourcery.com>

	* 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): Set ptrace options here.
	(linux_wait_1): ... not here.

---
 gdb/gdbserver/linux-low.c |   27 ++++++++++++++-------------
 gdb/gdbserver/linux-low.h |    4 ++++
 2 files changed, 18 insertions(+), 13 deletions(-)

Index: src/gdb/gdbserver/linux-low.c
===================================================================
--- src.orig/gdb/gdbserver/linux-low.c	2009-04-12 22:44:01.000000000 +0100
+++ src/gdb/gdbserver/linux-low.c	2009-04-30 22:38:20.000000000 +0100
@@ -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
@@ -309,7 +307,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;
 
@@ -344,7 +342,7 @@ linux_create_inferior (char *program, ch
   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;
 }
@@ -373,10 +371,6 @@ linux_attach_lwp_1 (unsigned long lwpid,
 	       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);
@@ -392,6 +386,11 @@ linux_attach_lwp_1 (unsigned long lwpid,
   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.
 
@@ -986,6 +985,13 @@ linux_wait_for_event_1 (ptid_t ptid, int
 	  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)
@@ -1248,11 +1254,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: src/gdb/gdbserver/linux-low.h
===================================================================
--- src.orig/gdb/gdbserver/linux-low.h	2009-04-12 22:44:01.000000000 +0100
+++ src/gdb/gdbserver/linux-low.h	2009-04-30 22:33:09.000000000 +0100
@@ -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;


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]