summaryrefslogtreecommitdiffstats
path: root/winsup/cygwin/fhandler_tty.cc
diff options
context:
space:
mode:
Diffstat (limited to 'winsup/cygwin/fhandler_tty.cc')
-rw-r--r--winsup/cygwin/fhandler_tty.cc30
1 files changed, 30 insertions, 0 deletions
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index 2eb430e14..f55eab21e 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -746,8 +746,14 @@ fhandler_tty_slave::write (const void *ptr, size_t len)
{
DWORD n, towrite = len;
+ bg_check_types bg = bg_check (SIGTTOU);
+ if (bg <= bg_eof)
+ return (ssize_t) bg;
+
termios_printf ("tty%d, write(%x, %d)", get_unit (), ptr, len);
+ push_process_state process_state (PID_TTYOU);
+
acquire_output_mutex (INFINITE);
while (len)
@@ -807,8 +813,17 @@ fhandler_tty_slave::read (void *ptr, size_t& len)
char peek_buf[INP_BUFFER_SIZE];
DWORD time_to_wait;
+ bg_check_types bg = bg_check (SIGTTIN);
+ if (bg <= bg_eof)
+ {
+ len = (size_t) bg;
+ return;
+ }
+
termios_printf ("read(%x, %d) handle %p", ptr, len, get_handle ());
+ push_process_state process_state (PID_TTYIN);
+
if (is_nonblocking () || !ptr) /* Indicating tcflush(). */
time_to_wait = 0;
else if ((get_ttyp ()->ti.c_lflag & ICANON))
@@ -848,6 +863,7 @@ fhandler_tty_slave::read (void *ptr, size_t& len)
totalread = -1;
goto out;
case WAIT_OBJECT_0 + 2:
+ process_state.pop ();
pthread::static_cancel_self ();
/*NOTREACHED*/
case WAIT_TIMEOUT:
@@ -885,6 +901,7 @@ fhandler_tty_slave::read (void *ptr, size_t& len)
totalread = -1;
goto out;
case WAIT_OBJECT_0 + 2:
+ process_state.pop ();
pthread::static_cancel_self ();
/*NOTREACHED*/
case WAIT_TIMEOUT:
@@ -1525,6 +1542,12 @@ fhandler_pty_master::write (const void *ptr, size_t len)
char *p = (char *) ptr;
termios ti = tc->ti;
+ bg_check_types bg = bg_check (SIGTTOU);
+ if (bg <= bg_eof)
+ return (ssize_t) bg;
+
+ push_process_state process_state (PID_TTYOU);
+
for (i = 0; i < (int) len; i++)
{
line_edit_status status = line_edit (p++, 1, ti);
@@ -1541,6 +1564,13 @@ fhandler_pty_master::write (const void *ptr, size_t len)
void __stdcall
fhandler_pty_master::read (void *ptr, size_t& len)
{
+ bg_check_types bg = bg_check (SIGTTIN);
+ if (bg <= bg_eof)
+ {
+ len = (size_t) bg;
+ return;
+ }
+ push_process_state process_state (PID_TTYIN);
len = (size_t) process_slave_output ((char *) ptr, len, pktmode);
}