* gdbserver/remote-utils.c (remote_open): Set gdbserver as "owner"
authorJ.T. Conklin <jtc@acorntoolworks.com>
Wed, 11 Jul 2001 17:33:24 +0000 (17:33 +0000)
committerJ.T. Conklin <jtc@acorntoolworks.com>
Wed, 11 Jul 2001 17:33:24 +0000 (17:33 +0000)
of SIGIO.
(input_interrupt): Don't block on read, in case we got redundant
SIGIO.  Don't gripe about redundant SIGIO.
* gdbserver/low-hppabsd.c (mywait): Use waitpid().  Enable SIGIO
handler while waiting.
* gdbserver/low-linux.c (mywait): Likewise.
* gdbserver/low-nbsd.c (mywait): Likewise.
* gdbserver/low-sparc.c (mywait): Likewise.

gdb/ChangeLog
gdb/gdbserver/low-hppabsd.c
gdb/gdbserver/low-linux.c
gdb/gdbserver/low-nbsd.c
gdb/gdbserver/low-sparc.c
gdb/gdbserver/remote-utils.c

index 2236826..988afa5 100644 (file)
@@ -1,3 +1,15 @@
+2001-07-11  Greg McGary  <greg@mcgary.org>
+       * gdbserver/remote-utils.c (remote_open): Set gdbserver as "owner"
+       of SIGIO.
+       (input_interrupt): Don't block on read, in case we got redundant
+       SIGIO.  Don't gripe about redundant SIGIO.
+       * gdbserver/low-hppabsd.c (mywait): Use waitpid().  Enable SIGIO
+       handler while waiting.
+       * gdbserver/low-linux.c (mywait): Likewise.
+       * gdbserver/low-nbsd.c (mywait): Likewise.
+       * gdbserver/low-sparc.c (mywait): Likewise.
+
 2001-07-11  Keith Seitz  <keiths@redhat.com>
 
        * infrun.c (print_stop_reason): Add missing uiout field
index 194ede2..b5f02ae 100644 (file)
@@ -96,7 +96,9 @@ mywait (char *status)
   int pid;
   union wait w;
 
-  pid = wait (&w);
+  enable_async_io ();
+  pid = waitpid (inferior_pid, &w, 0);
+  disable_async_io ();
   if (pid != inferior_pid)
     perror_with_name ("wait");
 
index ea210f3..eea8c1d 100644 (file)
@@ -105,7 +105,9 @@ mywait (char *status)
   int pid;
   union wait w;
 
-  pid = wait (&w);
+  enable_async_io ();
+  pid = waitpid (inferior_pid, &w, 0);
+  disable_async_io ();
   if (pid != inferior_pid)
     perror_with_name ("wait");
 
index 9a0f07a..3b3009f 100644 (file)
@@ -172,7 +172,9 @@ mywait (char *status)
   int pid;
   int w;
 
-  pid = wait (&w);
+  enable_async_io ();
+  pid = waitpid (inferior_pid, &w, 0);
+  disable_async_io ();
   if (pid != inferior_pid)
     perror_with_name ("wait");
 
index fda52ae..d2eb113 100644 (file)
@@ -102,7 +102,9 @@ mywait (char *status)
   int pid;
   union wait w;
 
-  pid = wait (&w);
+  enable_async_io ();
+  pid = waitpid (inferior_pid, &w, 0);
+  disable_async_io ();
   if (pid != inferior_pid)
     perror_with_name ("wait");
 
index f486b10..19f6715 100644 (file)
@@ -1,5 +1,5 @@
 /* Remote utility routines for the remote server for GDB.
-   Copyright 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000
+   Copyright 1986, 1989, 1993, 1994, 1995, 1996, 1997, 1998, 1999, 2000, 2001
    Free Software Foundation, Inc.
 
    This file is part of GDB.
@@ -32,6 +32,8 @@
 #include <sys/ioctl.h>
 #include <signal.h>
 #include <fcntl.h>
+#include <sys/time.h>
+#include <unistd.h>
 
 int remote_debug = 0;
 struct ui_file *gdb_stdlog;
@@ -156,8 +158,11 @@ remote_open (char *name)
 #if defined(F_SETFL) && defined (FASYNC)
   save_fcntl_flags = fcntl (remote_desc, F_GETFL, 0);
   fcntl (remote_desc, F_SETFL, save_fcntl_flags | FASYNC);
+#endif
+#if defined (F_SETOWN)
+  fcntl (remote_desc, F_SETOWN, getpid ());
+#endif
   disable_async_io ();
-#endif /* FASYNC */
   fprintf (stderr, "Remote debugging using %s\n", name);
 }
 
@@ -261,18 +266,29 @@ putpkt (char *buf)
 static void
 input_interrupt (void)
 {
-  int cc;
-  char c;
+  fd_set readset;
+  struct timeval immediate = { 0, 0 };
 
-  cc = read (remote_desc, &c, 1);
+  /* Protect against spurious interrupts.  This has been observed to
+     be a problem under NetBSD 1.4 and 1.5.  */
 
-  if (cc != 1 || c != '\003')
+  FD_ZERO (&readset);
+  FD_SET (remote_desc, &readset);
+  if (select (remote_desc + 1, &readset, 0, 0, &immediate) > 0)
     {
-      fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
-      return;
-    }
+      int cc;
+      char c;
+      
+      cc = read (remote_desc, &c, 1);
 
-  kill (inferior_pid, SIGINT);
+      if (cc != 1 || c != '\003')
+       {
+         fprintf (stderr, "input_interrupt, cc = %d c = %d\n", cc, c);
+         return;
+       }
+      
+      kill (inferior_pid, SIGINT);
+    }
 }
 
 void