diff options
author | Egor Duda <deo@logos-m.ru> | 2001-03-18 18:05:01 +0000 |
---|---|---|
committer | Egor Duda <deo@logos-m.ru> | 2001-03-18 18:05:01 +0000 |
commit | 5e8e21d938b5410b008f20d50d8d0fb9ba6df66b (patch) | |
tree | 5d5ee41620a03a0049e82ceb0877685c09d29da1 /winsup/cygwin/select.cc | |
parent | ca1cea7ed3a1befe70787e8a7a3bfd81f9cb5899 (diff) | |
download | cygnal-5e8e21d938b5410b008f20d50d8d0fb9ba6df66b.tar.gz cygnal-5e8e21d938b5410b008f20d50d8d0fb9ba6df66b.tar.bz2 cygnal-5e8e21d938b5410b008f20d50d8d0fb9ba6df66b.zip |
* fhandler.h (fhandler_tty_slave): Declare new methods.
* select.cc (fhandler_tty_slave::select_read): New method.
* select.cc (fhandler_tty_slave::ready_for_read): Ditto.
* select.cc (verify_tty_slave): New function.
* fhandler_termios.cc (fhandler_termios::line_edit): Empty input
buffer on signal.
* fhandler_tty.cc (fhandler_tty_slave::read): Check for input data
after reading from pipe. Reset event if input pipe is empty.
* tty.h (class tty): Allow creating events with manual reset.
* tty.cc (tty::get_event): Use manual_reset flag.
* tty.cc (tty::common_init): Create input_available_event with
manual reset.
Diffstat (limited to 'winsup/cygwin/select.cc')
-rw-r--r-- | winsup/cygwin/select.cc | 47 |
1 files changed, 47 insertions, 0 deletions
diff --git a/winsup/cygwin/select.cc b/winsup/cygwin/select.cc index 64c6ebb47..1823cd1c4 100644 --- a/winsup/cygwin/select.cc +++ b/winsup/cygwin/select.cc @@ -743,6 +743,53 @@ fhandler_tty_common::select_except (select_record *s) return ((fhandler_pipe *)this)->fhandler_pipe::select_except (s); } +static int +verify_tty_slave (select_record *me, fd_set *readfds, fd_set *writefds, + fd_set *exceptfds) +{ + if (WaitForSingleObject (me->h, 0) == WAIT_OBJECT_0) + me->read_ready = 1; + return set_bits (me, readfds, writefds, exceptfds); +} + +select_record * +fhandler_tty_slave::select_read (select_record *s) +{ + if (!s) + s = new select_record; + s->h = input_available_event; + s->startup = no_startup; + s->poll = poll_pipe; + s->verify = verify_tty_slave; + s->read_selected = TRUE; + s->cleanup = NULL; + return s; +} + +int +fhandler_tty_slave::ready_for_read (int fd, DWORD howlong, int ignra) +{ + HANDLE w4[2]; + if (!ignra && get_readahead_valid ()) + { + select_printf ("readahead"); + return 1; + } + w4[0] = signal_arrived; + w4[1] = input_available_event; + switch (WaitForMultipleObjects (2, w4, FALSE, howlong)) + { + case WAIT_OBJECT_0 + 1: + return 1; + case WAIT_FAILED: + select_printf ( "wait failed %E" ); + case WAIT_OBJECT_0: + case WAIT_TIMEOUT: + default: + return 0; + } +} + select_record * fhandler_dev_null::select_read (select_record *s) { |