diff options
author | J.T. Conklin <jtc@acorntoolworks.com> | 2001-07-11 17:33:24 +0000 |
---|---|---|
committer | J.T. Conklin <jtc@acorntoolworks.com> | 2001-07-11 17:33:24 +0000 |
commit | cf30a8e15b5ad7145914ee613d37760554ea606c (patch) | |
tree | 5859f8e7cd66780b7840452b390265a8e710483d /gdb/gdbserver/remote-utils.c | |
parent | 84c6c83cbc7569a373a6bb7d4ed588ef06aaf9a3 (diff) | |
download | gdb-cf30a8e15b5ad7145914ee613d37760554ea606c.zip gdb-cf30a8e15b5ad7145914ee613d37760554ea606c.tar.gz gdb-cf30a8e15b5ad7145914ee613d37760554ea606c.tar.bz2 |
* 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.
Diffstat (limited to 'gdb/gdbserver/remote-utils.c')
-rw-r--r-- | gdb/gdbserver/remote-utils.c | 36 |
1 files changed, 26 insertions, 10 deletions
diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index f486b10..19f6715 100644 --- a/gdb/gdbserver/remote-utils.c +++ b/gdb/gdbserver/remote-utils.c @@ -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 |