X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fser-base.c;h=c51be07e0fcfdb74412a746e80ba0c6e45627182;hb=0154d99053a95392380cd4629a89b0ac46df3737;hp=2f12125df65dcd178314cf4818021f3341640e5f;hpb=438e1e427e8393de73d22617abe4d8eba0270e72;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ser-base.c b/gdb/ser-base.c index 2f12125df6..c51be07e0f 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -1,6 +1,6 @@ /* Generic serial interface functions. - Copyright (C) 1992-2015 Free Software Foundation, Inc. + Copyright (C) 1992-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -153,7 +153,7 @@ run_async_handler_and_reschedule (struct serial *scb) static void fd_event (int error, void *context) { - struct serial *scb = context; + struct serial *scb = (struct serial *) context; if (error != 0) { scb->bufcnt = SERIAL_ERROR; @@ -164,7 +164,13 @@ fd_event (int error, void *context) pull characters out of the buffer. See also generic_readchar(). */ int nr; - nr = scb->ops->read_prim (scb, BUFSIZ); + + do + { + nr = scb->ops->read_prim (scb, BUFSIZ); + } + while (nr < 0 && errno == EINTR); + if (nr == 0) { scb->bufcnt = SERIAL_EOF; @@ -190,7 +196,7 @@ fd_event (int error, void *context) static void push_event (void *context) { - struct serial *scb = context; + struct serial *scb = (struct serial *) context; scb->async_state = NOTHING_SCHEDULED; /* Timers are one-off */ run_async_handler_and_reschedule (scb); @@ -207,6 +213,7 @@ ser_base_wait_for (struct serial *scb, int timeout) int numfds; struct timeval tv; fd_set readfds, exceptfds; + int nfds; /* NOTE: Some OS's can scramble the READFDS when the select() call fails (ex the kernel with Red Hat 5.2). Initialize all @@ -220,10 +227,13 @@ ser_base_wait_for (struct serial *scb, int timeout) FD_SET (scb->fd, &readfds); FD_SET (scb->fd, &exceptfds); + QUIT; + + nfds = scb->fd + 1; if (timeout >= 0) - numfds = gdb_select (scb->fd + 1, &readfds, 0, &exceptfds, &tv); + numfds = interruptible_select (nfds, &readfds, 0, &exceptfds, &tv); else - numfds = gdb_select (scb->fd + 1, &readfds, 0, &exceptfds, 0); + numfds = interruptible_select (nfds, &readfds, 0, &exceptfds, 0); if (numfds <= 0) { @@ -358,7 +368,11 @@ do_ser_base_readchar (struct serial *scb, int timeout) if (status < 0) return status; - status = scb->ops->read_prim (scb, BUFSIZ); + do + { + status = scb->ops->read_prim (scb, BUFSIZ); + } + while (status < 0 && errno == EINTR); if (status <= 0) { @@ -440,15 +454,21 @@ ser_base_readchar (struct serial *scb, int timeout) int ser_base_write (struct serial *scb, const void *buf, size_t count) { - const char *str = buf; + const char *str = (const char *) buf; int cc; while (count > 0) { + QUIT; + cc = scb->ops->write_prim (scb, str, count); if (cc < 0) - return 1; + { + if (errno == EINTR) + continue; + return 1; + } count -= cc; str += cc; }