From cf30a8e15b5ad7145914ee613d37760554ea606c Mon Sep 17 00:00:00 2001 From: "J.T. Conklin" Date: Wed, 11 Jul 2001 17:33:24 +0000 Subject: [PATCH] * 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/ChangeLog | 12 ++++++++++++ gdb/gdbserver/low-hppabsd.c | 4 +++- gdb/gdbserver/low-linux.c | 4 +++- gdb/gdbserver/low-nbsd.c | 4 +++- gdb/gdbserver/low-sparc.c | 4 +++- gdb/gdbserver/remote-utils.c | 36 ++++++++++++++++++++++++++---------- 6 files changed, 50 insertions(+), 14 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 223682672e..988afa5fcf 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,15 @@ +2001-07-11 Greg McGary + + * 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 * infrun.c (print_stop_reason): Add missing uiout field diff --git a/gdb/gdbserver/low-hppabsd.c b/gdb/gdbserver/low-hppabsd.c index 194ede2c57..b5f02ae4ed 100644 --- a/gdb/gdbserver/low-hppabsd.c +++ b/gdb/gdbserver/low-hppabsd.c @@ -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"); diff --git a/gdb/gdbserver/low-linux.c b/gdb/gdbserver/low-linux.c index ea210f3695..eea8c1df6b 100644 --- a/gdb/gdbserver/low-linux.c +++ b/gdb/gdbserver/low-linux.c @@ -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"); diff --git a/gdb/gdbserver/low-nbsd.c b/gdb/gdbserver/low-nbsd.c index 9a0f07a8eb..3b3009f295 100644 --- a/gdb/gdbserver/low-nbsd.c +++ b/gdb/gdbserver/low-nbsd.c @@ -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"); diff --git a/gdb/gdbserver/low-sparc.c b/gdb/gdbserver/low-sparc.c index fda52ae617..d2eb1139bb 100644 --- a/gdb/gdbserver/low-sparc.c +++ b/gdb/gdbserver/low-sparc.c @@ -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"); diff --git a/gdb/gdbserver/remote-utils.c b/gdb/gdbserver/remote-utils.c index f486b10e18..19f6715430 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