X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fser-base.c;h=c51be07e0fcfdb74412a746e80ba0c6e45627182;hb=0154d99053a95392380cd4629a89b0ac46df3737;hp=52c57264931642dcf2ce6b84d84638b91ad310f8;hpb=c628b528e091211bd746e5c9b18b5bc7298d01f3;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ser-base.c b/gdb/ser-base.c index 52c5726493..c51be07e0f 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -1,6 +1,6 @@ /* Generic serial interface functions. - Copyright (C) 1992-2013 Free Software Foundation, Inc. + Copyright (C) 1992-2016 Free Software Foundation, Inc. This file is part of GDB. @@ -23,9 +23,7 @@ #include "event-loop.h" #include "gdb_select.h" -#include "gdb_string.h" -#include "gdb_assert.h" -#include +#include "gdb_sys_time.h" #ifdef USE_WIN32API #include #endif @@ -155,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; @@ -166,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; @@ -192,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); @@ -209,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 @@ -222,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) { @@ -360,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) { @@ -442,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; } @@ -498,14 +516,14 @@ serial_ttystate ser_base_get_tty_state (struct serial *scb) { /* Allocate a dummy. */ - return (serial_ttystate) XMALLOC (int); + return (serial_ttystate) XNEW (int); } serial_ttystate ser_base_copy_tty_state (struct serial *scb, serial_ttystate ttystate) { /* Allocate another dummy. */ - return (serial_ttystate) XMALLOC (int); + return (serial_ttystate) XNEW (int); } int @@ -543,6 +561,14 @@ ser_base_setstopbits (struct serial *scb, int num) return 0; /* Never fails! */ } +/* Implement the "setparity" serial_ops callback. */ + +int +ser_base_setparity (struct serial *scb, int parity) +{ + return 0; /* Never fails! */ +} + /* Put the SERIAL device into/out-of ASYNC mode. */ void