Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEgor Duda <deo@logos-m.ru>2001-04-27 10:27:28 +0400
committerEgor Duda <deo@logos-m.ru>2001-04-27 10:27:28 +0400
commita069f5602ee213504a1e8f42048d2fc39b3126c3 (patch)
tree940973f80ae6cc80fa1a5c2ab82e3736bcdf4268
parent22ae5a5be8eeef5722e003ccf07b133a59018b66 (diff)
* tty.cc (tty::make_pipes): Set to_slave pipe mode to nonblocking.
* fhandler_tty.cc (fhandler_pty_master::accept_input): If pipe buffer is full, give slave a chance to read data.
-rw-r--r--winsup/cygwin/ChangeLog6
-rw-r--r--winsup/cygwin/fhandler_tty.cc30
-rw-r--r--winsup/cygwin/tty.cc4
3 files changed, 36 insertions, 4 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog
index 50f23f7c4..243d81909 100644
--- a/winsup/cygwin/ChangeLog
+++ b/winsup/cygwin/ChangeLog
@@ -1,3 +1,9 @@
+2001-04-27 Egor Duda <deo@logos-m.ru>
+
+ * tty.cc (tty::make_pipes): Set to_slave pipe mode to nonblocking.
+ * fhandler_tty.cc (fhandler_pty_master::accept_input): If pipe buffer
+ is full, give slave a chance to read data.
+
2001-04-26 Kazuhiro Fujieda <fujieda@jaist.ac.jp>
* security.cc (alloc_sd): Add unrelated ACCESS_ALLOWED_ACE behind
diff --git a/winsup/cygwin/fhandler_tty.cc b/winsup/cygwin/fhandler_tty.cc
index e33d1d31b..acb10a93d 100644
--- a/winsup/cygwin/fhandler_tty.cc
+++ b/winsup/cygwin/fhandler_tty.cc
@@ -167,18 +167,40 @@ fhandler_pty_master::doecho (const void *str, DWORD len)
int
fhandler_pty_master::accept_input ()
{
- DWORD written;
+ DWORD bytes_left, written;
DWORD n;
DWORD rc;
+ char* p;
rc = WaitForSingleObject (input_mutex, INFINITE);
- n = get_ttyp ()->read_retval = eat_readahead (-1);
+ bytes_left = n = eat_readahead (-1);
+ get_ttyp ()->read_retval = 0;
+ p = rabuf;
if (n != 0)
{
- termios_printf ("about to write %d chars to slave", n);
- rc = WriteFile (get_output_handle (), rabuf, n, &written, NULL);
+ while (bytes_left > 0)
+ {
+ termios_printf ("about to write %d chars to slave", bytes_left);
+ rc = WriteFile (get_output_handle (), p, bytes_left, &written, NULL);
+ if (!rc)
+ {
+ debug_printf ("error writing to pipe %E");
+ break;
+ }
+ get_ttyp ()->read_retval += written;
+ p += written;
+ bytes_left -= written;
+ if (bytes_left > 0)
+ {
+ debug_printf ("to_slave pipe is full");
+ SetEvent (input_available_event);
+ ReleaseMutex (input_mutex);
+ Sleep (10);
+ rc = WaitForSingleObject (input_mutex, INFINITE);
+ }
+ }
}
else
termios_printf ("sending EOF to slave");
diff --git a/winsup/cygwin/tty.cc b/winsup/cygwin/tty.cc
index 768c21cd2..36ff39cd8 100644
--- a/winsup/cygwin/tty.cc
+++ b/winsup/cygwin/tty.cc
@@ -367,6 +367,10 @@ tty::make_pipes (fhandler_pty_master *ptym)
ProtectHandle1 (from_slave, from_pty);
termios_printf ("tty%d from_slave %p, to_slave %p", ntty, from_slave,
to_slave);
+
+ DWORD pipe_mode = PIPE_NOWAIT;
+ if (!SetNamedPipeHandleState (to_slave, &pipe_mode, NULL, NULL))
+ termios_printf ("can't set to_slave to non-blocking mode");
ptym->set_io_handle (from_slave);
ptym->set_output_handle (to_slave);
return TRUE;