From Jonathan L. Fix ser-unix.c timing out when there was no timeout.
This commit is contained in:
parent
5d161b2419
commit
2171aa415b
@ -1,3 +1,10 @@
|
||||
Tue Mar 28 18:19:50 2000 Andrew Cagney <cagney@b1.cygnus.com>
|
||||
|
||||
From 2000-03-20 Jonathan Larmour <jlarmour@redhat.co.uk>:
|
||||
* 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 <dan@cgsoftware.com>
|
||||
|
||||
* gdbtypes.c (_initialize_gdbtypes): Add "set debug overload",
|
||||
|
@ -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. */
|
||||
|
||||
else if (timeout == 0)
|
||||
{
|
||||
status = SERIAL_TIMEOUT;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
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 */
|
||||
}
|
||||
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 */
|
||||
}
|
||||
|
||||
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. */
|
||||
|
Loading…
Reference in New Issue
Block a user