From ab5ba170e9111446867b2f522686d6e0b2fe3de6 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Sat, 2 Dec 2000 14:56:20 +0000 Subject: [PATCH] * ser-unix.c (wait_for): Initialize the FD_SET before every select call. (ser_unix_wait_for): Ditto. --- gdb/ChangeLog | 6 ++++ gdb/ser-unix.c | 77 ++++++++++++++++++++++++++------------------------ 2 files changed, 46 insertions(+), 37 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d2f41a0784..250b327375 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Sun Dec 3 01:54:49 2000 Andrew Cagney + + * ser-unix.c (wait_for): Initialize the FD_SET before every select + call. + (ser_unix_wait_for): Ditto. + Sun Dec 3 01:01:02 2000 Andrew Cagney * Makefile.in (varobj.o): Delete special .c.o rule supressing diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 791c3fae3d..b75e3387e4 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -435,37 +435,37 @@ static int wait_for (serial_t scb, int timeout) { #ifdef HAVE_SGTTY - { - struct timeval tv; - fd_set readfds; + while (1) + { + struct timeval tv; + fd_set readfds; + int numfds; - FD_ZERO (&readfds); + /* NOTE: Some OS's can scramble the READFDS when the select() + call fails (ex the kernel with Red Hat 5.2). Initialize all + arguments before each call. */ - tv.tv_sec = timeout; - tv.tv_usec = 0; + tv.tv_sec = timeout; + tv.tv_usec = 0; - FD_SET (scb->fd, &readfds); + FD_ZERO (&readfds); + FD_SET (scb->fd, &readfds); - while (1) - { - int numfds; + if (timeout >= 0) + numfds = select (scb->fd + 1, &readfds, 0, 0, &tv); + else + numfds = select (scb->fd + 1, &readfds, 0, 0, 0); - if (timeout >= 0) - numfds = select (scb->fd + 1, &readfds, 0, 0, &tv); + if (numfds <= 0) + if (numfds == 0) + return SERIAL_TIMEOUT; + else if (errno == EINTR) + continue; else - numfds = select (scb->fd + 1, &readfds, 0, 0, 0); + return SERIAL_ERROR; /* Got an error from select or poll */ - if (numfds <= 0) - if (numfds == 0) - return SERIAL_TIMEOUT; - else if (errno == EINTR) - continue; - else - return SERIAL_ERROR; /* Got an error from select or poll */ - - return 0; - } - } + return 0; + } #endif /* HAVE_SGTTY */ #if defined HAVE_TERMIO || defined HAVE_TERMIOS @@ -858,21 +858,24 @@ ser_unix_nop_raw (serial_t scb) int ser_unix_wait_for (serial_t scb, int timeout) { - int numfds; - struct timeval tv; - fd_set readfds, exceptfds; - - FD_ZERO (&readfds); - FD_ZERO (&exceptfds); - - tv.tv_sec = timeout; - tv.tv_usec = 0; - - FD_SET (scb->fd, &readfds); - FD_SET (scb->fd, &exceptfds); - while (1) { + int numfds; + struct timeval tv; + fd_set readfds, exceptfds; + + /* NOTE: Some OS's can scramble the READFDS when the select() + call fails (ex the kernel with Red Hat 5.2). Initialize all + arguments before each call. */ + + tv.tv_sec = timeout; + tv.tv_usec = 0; + + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (scb->fd, &readfds); + FD_SET (scb->fd, &exceptfds); + if (timeout >= 0) numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv); else