Hi, As I have recently mentioned on the main Cygwin mailing list, Cygwin by default creates FILE_FLAG_OVERLAPPED named pipes for the standard file handles (stdin/stdout/stderr). These overlapped pipes require all programs using ReadFile/WriteFile to use overlapped I/O when using the pipes. Since standard runtimes in Win32 programs don't normally use overlapped I/O on the standard file handles, most Win32 programs will exhibit undefined behavior when called by Cygwin. In my case, it has resulted in a problem with calling .NET Framework 4.0 programs from Cygwin (which, coincidentally, NETFX 4.0 also probably has a bug resulting in undefined behavior that definitely clashes with overlapped pipes).
The attached patch creates a new "pipe_nooverlap" flag in the CYGWIN environment variable (similar to the existing pipe_byte flag). By default, the flag would not be set and Cygwin will continue to make overlapped pipes by default, because I did not know if this will result in any breakages elsewhere in some Cygwin packages. If the new "pipe_nooverlap" flag is set, then Cygwin won't make overlapped pipes by default (i.e. pipes made by the pipe or pipe2 functions). For me, this got NETFX 4.0 programs working again. I've been using it all day today with no ill effects noted. It seems safe to use. But I made it a flag because I am not 100% certain that some package won't break, and it isn't needed if you are only running Cygwin programs (which presumably use Cygwin1.dll which presumably is using overlapped I/O everywhere). If the maintainers feel that a CYGWIN flag isn't necessary and it is safe to always remove FILE_FLAG_OVERLAPPED, then I can submit a patch that doesn't have the "pipe_nooverlap" flag - i.e. just assumes the flag is always set. Thank you for the consideration of this patch. Here are the change log entries: 2013-12-24 James Johnston <jam...@motionview3d.com> * environ.cc (struct parse_thing): Add "pipe_nooverlap" option. * globals.cc (pipe_nooverlap): Declare. * pipe.cc (fhandler_pipe::create): Honor pipe_nooverlap to create non- overlapped pipes if set. ==== Documentation changelog entry ==== 2013-12-24 James Johnston <jam...@motionview3d.com> * cygwinenv.xml: Add pipe_nooverlap description. Best regards, James Johnston
pipepatch
Description: Binary data