From cf30a8e15b5ad7145914ee613d37760554ea606c Mon Sep 17 00:00:00 2001 From: "J.T. Conklin" Date: Wed, 11 Jul 2001 17:33:24 +0000 Subject: * 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. --- gdb/gdbserver/remote-utils.c | 36 ++++++++++++++++++++++++++---------- 1 file changed, 26 insertions(+), 10 deletions(-) (limited to 'gdb/gdbserver/remote-utils.c') 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 #include #include +#include +#include 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 -- cgit v1.1