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 | |
parent | b045c3f9e7084ec150e57bd523c938c96528a0e7 (diff) | |
download | gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.zip gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.tar.gz gdb-ab5ba170e9111446867b2f522686d6e0b2fe3de6.tar.bz2 |
* ser-unix.c (wait_for): Initialize the FD_SET before every select
call.
(ser_unix_wait_for): Ditto.
-rw-r--r-- | gdb/ChangeLog | 6 | ||||
-rw-r--r-- | gdb/ser-unix.c | 73 |
2 files changed, 44 insertions, 35 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d2f41a0..250b327 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +Sun Dec 3 01:54:49 2000 Andrew Cagney <cagney@b1.cygnus.com> + + * 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 <cagney@b1.cygnus.com> * Makefile.in (varobj.o): Delete special .c.o rule supressing diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 791c3fa..b75e338 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 |