diff options
Diffstat (limited to 'gdb/ser-base.c')
-rw-r--r-- | gdb/ser-base.c | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gdb/ser-base.c b/gdb/ser-base.c index 790cb1b..2bfe82b 100644 --- a/gdb/ser-base.c +++ b/gdb/ser-base.c @@ -288,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; @@ -313,6 +315,17 @@ ser_base_read_error_fd (struct serial *scb, int close_fd) } } +/* 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 @@ -589,6 +602,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 { @@ -607,5 +623,8 @@ ser_base_async (struct serial *scb, delete_timer (scb->async_state); break; } + + if (scb->error_fd != -1) + delete_file_handler (scb->error_fd); } } |