diff options
author | Andrew Cagney <cagney@redhat.com> | 2000-12-02 14:56:20 +0000 |
---|---|---|
committer | Andrew Cagney <cagney@redhat.com> | 2000-12-02 14:56:20 +0000 |
commit | ab5ba170e9111446867b2f522686d6e0b2fe3de6 (patch) | |
tree | 55de524b1f78378ca65e061841c849ae0ac196bc /gdb/ser-unix.c | |
parent | Really check-in: (diff) | |
download | binutils-gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.tar.gz binutils-gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.tar.bz2 binutils-gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.zip |
* ser-unix.c (wait_for): Initialize the FD_SET before every select
call.
(ser_unix_wait_for): Ditto.
Diffstat (limited to 'gdb/ser-unix.c')
-rw-r--r-- | gdb/ser-unix.c | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 791c3fae3da..b75e3387e40 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); - - 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 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; + while (1) + { + int numfds; + struct timeval tv; + fd_set readfds, exceptfds; - FD_ZERO (&readfds); - FD_ZERO (&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; + tv.tv_sec = timeout; + tv.tv_usec = 0; - FD_SET (scb->fd, &readfds); - FD_SET (scb->fd, &exceptfds); + FD_ZERO (&readfds); + FD_ZERO (&exceptfds); + FD_SET (scb->fd, &readfds); + FD_SET (scb->fd, &exceptfds); - while (1) - { if (timeout >= 0) numfds = select (scb->fd + 1, &readfds, 0, &exceptfds, &tv); else |