On Fri, 6 Sep 2024 18:01:08 +0900 Takashi Yano wrote: > @@ -655,19 +655,17 @@ pipe_data_available (int fd, fhandler_base *fh, HANDLE > h, int flags) > handling this fact. */ > if (fh->get_device () == FH_PIPEW && fpli.WriteQuotaAvailable == 0) > { > - HANDLE query_hdl = ((fhandler_pipe *) fh)->get_query_handle (); > - if (!query_hdl) > - query_hdl = ((fhandler_pipe *) fh)->temporary_query_hdl (); > - if (!query_hdl) /* We cannot know actual write pipe space. */ > - return (flags & PDA_SELECT) ? PIPE_BUF : 1; > - DWORD nbytes_in_pipe; > - BOOL res = > - PeekNamedPipe (query_hdl, NULL, 0, NULL, &nbytes_in_pipe, NULL); > - if (!((fhandler_pipe *) fh)->get_query_handle ()) > - CloseHandle (query_hdl); /* Close temporary query_hdl */ > - if (!res) /* We cannot know actual write pipe space. */ > - return (flags & PDA_SELECT) ? PIPE_BUF : 1; > - fpli.WriteQuotaAvailable = fpli.InboundQuota - nbytes_in_pipe; > + /* NtSetInformationFile() in set_pipe_non_blocking(true) > + seems to fail for unknown reasons with STATUS_PIPE_BUSY > + if no reader is reading the pipe. In this case, the pipe > + is really full if WriteQuotaAvailable is zero. Otherwise, > + the pipe is empty. */ > + if (!((fhandler_pipe *) fh)->set_pipe_non_blocking (true)) > + return 0; /* Full */ > + /* Restore pipe mode to blocking mode */ > + ((fhandler_pipe *) fh)->set_pipe_non_blocking (false); > + /* Empty */ > + fpli.WriteQuotaAvailable = fpli.IutboundQuota; ^^^ In of cource... > } > if (fpli.WriteQuotaAvailable > 0) > {
-- Takashi Yano <takashi.y...@nifty.ne.jp>