[PATCH] Cygwin: pipe: Add workaround for native ninja
Corinna Vinschen
corinna-cygwin@cygwin.com
Mon Mar 31 14:25:09 GMT 2025
Hi Takashi,
On Mar 31 22:27, Takashi Yano wrote:
> Native (non-cygwin) ninja creates pipe with size == 0, and starts
> cygwin process with that pipe. This causes infinite loop in the
> fhandler_fifo_pipe::raw_write(). Ideally, the pipe implementation
> in cygwin could work even with pipe size == 0, however, it seems
> impossible due to:
>
> (1) select() does not work for that pipe because PeekNamedPipe()
> always returns 0. Read side is ready to read only when the
> write side is about to write, but there is no way to know that.
> (2) The cause of the problem:
> https://cygwin.com/pipermail/cygwin/2025-January/257143.html
> cannot be avoidable. To avoid CancelIo() problem, the patch
> https://cygwin.com/pipermail/cygwin-patches/2025q1/013451.html
> restricts the data size less than the current pipe space.
> However, if pipe size is zero this is impossible.
>
> This patch adds just a workaround for native ninja that avoid
> infinite loop in raw_write().
> [...]
> @@ -670,7 +670,9 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE h, int mode)
> fpli.WriteQuotaAvailable);
> return fpli.WriteQuotaAvailable;
> }
> - /* TODO: Buffer really full or non-Cygwin reader? */
> + return PIPE_BUF; /* Workaround for native ninja. Native ninja creates
> + pipe with size == 0, and starts cygwin process
> + with that pipe. */
Funny that this problem cleared up this TODO entry :)))
Please push.
Thanks,
Corinna
More information about the Cygwin-patches
mailing list