X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fser-base.c;h=f7e76ce575096b1d0864f55c92db83e5f455a1b6;hb=aac4760f70a4ba503f01a967b33cc218dfc37144;hp=3e100338af7aa9cda08d5e5ed9c7647cd7d751f9;hpb=61baf725eca99af2569262d10aca03dcde2698f6;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ser-base.c b/gdb/ser-base.c index 3e100338af..f7e76ce575 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -1,6 +1,6 @@ /* Generic serial interface functions. - Copyright (C) 1992-2017 Free Software Foundation, Inc. + Copyright (C) 1992-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -23,7 +23,7 @@ #include "event-loop.h" #include "gdb_select.h" -#include "gdb_sys_time.h" +#include "gdbsupport/gdb_sys_time.h" #ifdef USE_WIN32API #include #endif @@ -46,7 +46,7 @@ enum { /* >= 0 (TIMER_SCHEDULED) */ /* The ID of the currently scheduled timer event. This state is rarely encountered. Timer events are one-off so as soon as the - event is delivered the state is shanged to NOTHING_SCHEDULED. */ + event is delivered the state is changed to NOTHING_SCHEDULED. */ FD_SCHEDULED = -1, /* The fd_event() handler is scheduled. It is called when ever the file descriptor becomes ready. */ @@ -191,7 +191,7 @@ fd_event (int error, void *context) /* PUSH_EVENT: The input FIFO is non-empty (or there is a pending error). Nag the client until all the data has been read. In the case of errors, the client will need to close or de-async the - device before naging stops. */ + device before nagging stops. */ static void push_event (void *context) @@ -205,6 +205,11 @@ push_event (void *context) /* Wait for input on scb, with timeout seconds. Returns 0 on success, otherwise SERIAL_TIMEOUT or SERIAL_ERROR. */ +/* NOTE: Some of the code below is dead. The only possible values of + the TIMEOUT parameter are ONE and ZERO. OTOH, we should probably + get rid of the deprecated_ui_loop_hook call in do_ser_base_readchar + instead and support infinite time outs here. */ + static int ser_base_wait_for (struct serial *scb, int timeout) { @@ -283,6 +288,8 @@ ser_base_read_error_fd (struct serial *scb, int close_fd) if (s == 0 && close_fd) { /* End of file. */ + if (serial_is_async_p (scb)) + delete_file_handler (scb->error_fd); close (scb->error_fd); scb->error_fd = -1; break; @@ -308,10 +315,22 @@ ser_base_read_error_fd (struct serial *scb, int close_fd) } } -/* Read a character with user-specified timeout. TIMEOUT is number of seconds - to wait, or -1 to wait forever. Use timeout of 0 to effect a poll. Returns - char if successful. Returns -2 if timeout expired, EOF if line dropped - dead, or -3 for any other error (see errno in that case). */ +/* Event-loop callback for a serial's error_fd. Flushes any error + output we might have. */ + +static void +handle_error_fd (int error, gdb_client_data client_data) +{ + serial *scb = (serial *) client_data; + + ser_base_read_error_fd (scb, 0); +} + +/* Read a character with user-specified timeout. TIMEOUT is number of + seconds to wait, or -1 to wait forever. Use timeout of 0 to effect + a poll. Returns char if successful. Returns SERIAL_TIMEOUT if + timeout expired, SERIAL_EOF if line dropped dead, or SERIAL_ERROR + for any other error (see errno in that case). */ static int do_ser_base_readchar (struct serial *scb, int timeout) @@ -532,14 +551,6 @@ ser_base_set_tty_state (struct serial *scb, serial_ttystate ttystate) return 0; } -int -ser_base_noflush_set_tty_state (struct serial *scb, - serial_ttystate new_ttystate, - serial_ttystate old_ttystate) -{ - return 0; -} - void ser_base_print_tty_state (struct serial *scb, serial_ttystate ttystate, @@ -583,6 +594,9 @@ ser_base_async (struct serial *scb, fprintf_unfiltered (gdb_stdlog, "[fd%d->asynchronous]\n", scb->fd); reschedule (scb); + + if (scb->error_fd != -1) + add_file_handler (scb->error_fd, handle_error_fd, scb); } else { @@ -601,5 +615,8 @@ ser_base_async (struct serial *scb, delete_timer (scb->async_state); break; } + + if (scb->error_fd != -1) + delete_file_handler (scb->error_fd); } }