This is the mail archive of the cygwin mailing list for the Cygwin project.

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: Cygwin hangs up if several keys are typed during outputting a lot of texts.

Hi Corinna,

On Tue, 14 Apr 2015 09:34:56 +0200
Corinna Vinschen <> wrote:

> And the native client, not knowing what he's talking to, recognizes the
> output stream as a normal named pipe, if it's looking for that info at
> all.  Being native, it will use native Windows MSVCRT stdio calls.
> Worse, as you can see in the behaviour of some native applications, the
> MSVCRT isatty() call returns 0 for named pipes.
> If we have a Cygwin client, we can do all kinds of stuff on the slave
> side, but as soon as we have a native client, only the master side of
> the pty has any chance to do the right thing.  That's why I wrote that
> we don't have the slave side under control.
> Therefore we should really move the OPOST code back to the master side.
> I'm reluctant to just revert your patch, though, because I think you
> know better how to fix the OPOST code to make it work correctly on the
> master side.

So OPOST processing should be in master side for native windows program.
However, to solve the second problem I had pointed out in ,
OPOST processing should be done on a timing when slave calls write().

To solve this antinomy, I have made a patch attached.

With this patch, new pipe is introduced to handle OPSOT-process separately
between native windows program and cygwin program.

Data from cygwin program is passed through the pipe newly introduced.
In this case, process_opost_output() is called in fhandler_pty_slave::write().
Master reads data, which is already applied OPOST process, from the
new pipe.

On the other hands, for native windows program, data is written into
conventional pipe. Master forwarding thread, which is also newly
introduced, reads conventional pipe and forward the data to the pipe
newly introduced by calling process_opost_output(). This makes OPOST
processing be done in master side.

I have confirmed that the both problem is fixed with this patch.

By the way,
I know that the names for the new pipe such as io_handle2, to_master2
and output_handle2 are ugly enough. Are there more appropriate names?

ChangeLog is as follows.

2015-04-16  Takashi Yano  <>

	* fhandler.h (class fhandler_base): Add virtual function get_io_handle2
	to get handle from which OPOST-processed output is read on PTY master.
	(class fhandler_pty_slave): Add variable output_handle2 to store handle
	for OPOST-processed output. Add two functions set_output_handle2() and
	get_output_handle2() regarding variable output_handle2. Now,
	output_handle (not 2) is used only by native windows program for
	OPOST-processing in master side. For cygwin process, output_handle2 is
	used for handling OPOST-processing in slave side.
	(class fhandler_pty_master): Add variables io_handle2 and to_master2 to
	store handles for OPOST-processed output. Add pty_master_fwd_thread and
	function pty_master_fwd_thread() for a thread which forwards data from
	io_handle to to_master2 applying OPOST-processing. Add function
	get_io_handle2() regarding variable io_handle2. Now, io_handle and
	to_master are used only by native windows program for OPOST-processing
	in master side. For cygwin process, io_handle2 and to_master2 are used
	for handling OPOST-processing in slave side.
	* (struct pipe_reply): Add member to_master2.
	(fhandler_pty_master::process_slave_output): Read slave output from
	io_handle2 rather than io_handle.
	(fhandler_pty_slave::fhandler_pty_salve): Initialize output_handle2.
	(fhandler_pty_slave::open): Set output_handle2 by duplicating handle
	to_master2 on PTY master.
	(fhandler_pty_slave::close): Close handle output_handle2.
	(fhandler_pty_slave::write): Write data to output_handle2 rather than
	(fhandler_pty_slave::fch_close_handles): Close handle output_handle2.
	(fhandler_pty_master::fhandler_pty_master): Initialize io_handle2,
	to_master2 and master_fwd_thread.
	(fhandler_pty_master::cleanup): Clean up to_master2 as well.
	(fhandler_pty_master::close): Print to_master2 as well in debug
	message. Terminate master forwarding thread. Close handles to_master2
	and io_handle2.
	(fhandler_pty_master::ioctl): Use io_handle2 rather than to_master.
	(fhandler_pty_master::pty_master_thread): Add code for duplicating
	handle to_master2.
	(fhandler_pty_master::pty_master_fwd_thread): New function for
	a thread to forward OPOST-processed data from io_handle to to_master2.
	This thread applies OPOST-processing to the output of native windows
	(::pty_master_fwd_thread): Ditto.
	(fhandler_pty_master::setup): Create new pipe for OPOST-processed
	output. Create new thread to forward data from io_handle to to_master2.
	Set handle to_master2 to tty. Print io_handle2 as well in debug message.
	Close handles io_handle2 and to_master2 in case of error.
	(fhandler_pty_master::fixup_after_fork): Set handle to_master2 to tty.
	Copy handle to_master2 from arch->to_master2.
	(fhandler_pty_master::fixup_after_exec): Clean up to_master2.
	* Check handle returned by get_io_handle2() rather than
	* tty.h(class tty): Add variable _to_master2 to store handle to which
	OPOST-processed data is written. Add two functions to_master2() and
	set_to_master2() regarding _to_master2.

Takashi Yano <>

Attachment: cygwin.patch.20150416-2
Description: Binary data

Problem reports:
Unsubscribe info:

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]