Thread (41 messages) 41 messages, 4 authors, 2022-08-20

Re: [PATCH] mingw: handle writes to non-blocking pipe

From: Jeff King <hidden>
Date: 2022-08-17 05:39:36

On Sun, Aug 14, 2022 at 05:37:08PM +0200, René Scharfe wrote:
Turns out that's not the case on Windows: 94f4d01932 (mingw: workaround
for hangs when sending STDIN, 2020-02-17) changed the compatibility
implementation to 'Make `poll()` always reply "writable" for write end
of the pipe.'.
Ah, good find. That kind of explains everything, then, I think. ;)
quoted
I'm not sure what "small enough" we can rely on, though. Really it is
the interplay between poll() and write() that we care about here. We
would like to know at what point poll() will tell us it's OK to write().
But we don't know what the OS thinks of that.
Based on the output above I think Linux' poll() won't consider a pipe
writable that has less than PIPE_BUF (4096) available bytes.
Right, that makes sense. It would have to in order to meet the atomicity
requirement for write(), but still always make forward progress for each
write().
Perhaps we should take the advice about PIPE_NOWAIT in the docs serious
and use overlapping (asynchronous) writes on Windows instead.  This
would mean reimplementing the whole pipe_command() with Windows API
commands, I imagine.
I wouldn't be opposed to that, in the sense that it's supposed to be a
black box to the caller, and it's relatively small in size. But I think
we're pretty close to having something usable without that, so I'd like
to pursue a smaller fix in the interim.
Avoiding xwrite() in pump_io_round() on top lets the test suite
finish successfully.
That makes sense. We end up busy-looping between poll() and write()
while we wait for our read descriptor to become available. But if poll()
doesn't block, that's the best we can do.

-Peff
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help