From 867ffa5486c6eedd44b44e37569b4206db9aeca9 Mon Sep 17 00:00:00 2001 From: Andrew Cagney Date: Tue, 28 Mar 2000 08:24:28 +0000 Subject: [PATCH] From Jonathan L. Fix ser-unix.c timing out when there was no timeout. --- gdb/ChangeLog | 7 +++++++ gdb/ser-unix.c | 65 +++++++++++++++++++++++----------------------------------- 2 files changed, 33 insertions(+), 39 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index bc83460c49..24b1811800 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,10 @@ +Tue Mar 28 18:19:50 2000 Andrew Cagney + + From 2000-03-20 Jonathan Larmour : + * ser-unix.c (do_unix_readchar): Reorganise to be more robust, + particularly ensuring it can't return SERIAL_TIMEOUT when told + not to time out. + 2000-03-24 Daniel Berlin * gdbtypes.c (_initialize_gdbtypes): Add "set debug overload", diff --git a/gdb/ser-unix.c b/gdb/ser-unix.c index 919c9fd90d..47b6647311 100644 --- a/gdb/ser-unix.c +++ b/gdb/ser-unix.c @@ -910,9 +910,9 @@ do_unix_readchar (serial_t scb, int timeout) each time through the loop. Also, timeout = 0 means to poll, so we just set the delta to 0, so we - will only go through the loop once. */ + will only go through the loop once. timeout < 0 means to wait forever. */ - delta = (timeout == 0 ? 0 : 1); + delta = (timeout <= 0 ? 0 : 1); while (1) { @@ -928,51 +928,38 @@ do_unix_readchar (serial_t scb, int timeout) return SERIAL_TIMEOUT; } - status = ser_unix_wait_for (scb, delta); + status = ser_unix_wait_for (scb, timeout < 0 ? timeout : delta); timeout -= delta; - /* If we got a character or an error back from wait_for, then we can - break from the loop before the timeout is completed. */ + /* If we got an error back from wait_for, then we can return */ - if (status != SERIAL_TIMEOUT) - { - break; - } + if (status == SERIAL_ERROR) + return status; - /* If we have exhausted the original timeout, then generate - a SERIAL_TIMEOUT, and pass it out of the loop. */ + status = read (scb->fd, scb->buf, BUFSIZ); - else if (timeout == 0) - { - status = SERIAL_TIMEOUT; - break; + if (status <= 0) + { + if (status == 0) + { + if (timeout != 0) + continue; + else + return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to + distinguish between EOF & timeouts + someday] */ + } + else if (errno == EINTR) + continue; + else + return SERIAL_ERROR; /* Got an error from read */ } - } - - if (status < 0) - return status; - while (1) - { - status = read (scb->fd, scb->buf, BUFSIZ); - if (status != -1 || errno != EINTR) - break; - } - - if (status <= 0) - { - if (status == 0) - return SERIAL_TIMEOUT; /* 0 chars means timeout [may need to - distinguish between EOF & timeouts - someday] */ - else - return SERIAL_ERROR; /* Got an error from read */ + scb->bufcnt = status; + scb->bufcnt--; + scb->bufp = scb->buf; + return *scb->bufp++; } - - scb->bufcnt = status; - scb->bufcnt--; - scb->bufp = scb->buf; - return *scb->bufp++; } /* Perform operations common to both old and new readchar. */ -- 2.11.0