[PATCH 3 of 3] windows: convert readpipe() to nonblocking like 331cbf088c4c does for posix

Pierre-Yves David pierre-yves.david at ens-lyon.org
Tue Apr 14 19:48:15 UTC 2015



On 04/07/2015 08:56 AM, Yuya Nishihara wrote:
> On Mon, 06 Apr 2015 22:49:02 -0400, Matt Harbison wrote:
>> # HG changeset patch
>> # User Matt Harbison <matt_harbison at yahoo.com>
>> # Date 1428373243 14400
>> #      Mon Apr 06 22:20:43 2015 -0400
>> # Node ID 7a8e37db057fb3b1fb77ee08df83076e1a527af7
>> # Parent  5ad3c1f7fa75a06307f430ee51c19d85e6c78d14
>> windows: convert readpipe() to nonblocking like 331cbf088c4c does for posix
>>
>> There are several places in the Windows SSH tests where the order of local
>> output vs remote output differ from the other platforms.  This only fixes one of
>> those cases (and interstingly, not the one added in order to test 331cbf088c4c),
>> so there is more investigation needed.  However, without this patch, test-ssl.t
>> also has this diff:
>>
>>      --- c:/Users/Matt/Projects/hg/tests/test-ssh.t
>>      +++ c:/Users/Matt/Projects/hg/tests/test-ssh.t.err
>>      @@ -397,11 +397,11 @@
>>         $ hg push --ssh "sh ../ssh.sh"
>>         pushing to ssh://user@dummy/*/remote (glob)
>>         searching for changes
>>      -  remote: Permission denied
>>      -  remote: abort: prechangegroup.hg-ssh hook failed
>>      -  remote: Permission denied
>>      -  remote: pushkey-abort: prepushkey.hg-ssh hook failed
>>         updating 6c0482d977a3 to public failed!
>>      +  remote: Permission denied
>>      +  remote: abort: prechangegroup.hg-ssh hook failed
>>      +  remote: Permission denied
>>      +  remote: pushkey-abort: prepushkey.hg-ssh hook failed
>>         [1]
>>
>>         $ cd ..
>>
>> Output with this change was stable over 700+ runs of test-ssl.t.  I initially
>> tried a background thread to read the pipe[1], but this was simpler and the test
>> results were exactly the same.
>>
>> [1] http://eyalarubas.com/python-subproc-nonblock.html
>>
>> diff --git a/mercurial/win32.py b/mercurial/win32.py
>> --- a/mercurial/win32.py
>> +++ b/mercurial/win32.py
>> @@ -243,6 +243,8 @@
>>       finally:
>>           _kernel32.CloseHandle(fh)
>>
>> +PIPE_NOWAIT = 1
>> +
>>   def getpipestate(pipe):
>>       handle = msvcrt.get_osfhandle(pipe.fileno())
>>       if handle == -1:
>> diff --git a/mercurial/windows.py b/mercurial/windows.py
>> --- a/mercurial/windows.py
>> +++ b/mercurial/windows.py
>> @@ -362,14 +362,19 @@
>>   def readpipe(pipe):
>>       """Read all available data from a pipe."""
>>       chunks = []
>> -    while True:
>> -        size = os.fstat(pipe.fileno()).st_size
>> -        if not size:
>> -            break
>> +    oldstate = win32.getpipestate(pipe)
>> +    win32.setpipestate(pipe, win32.PIPE_NOWAIT)
>
> The doc says "Note that nonblocking mode [...] should not be used to achieve
> asynchronous input and output (I/O) with named pipes."
>
> https://msdn.microsoft.com/en-us/library/windows/desktop/aa365787%28v=vs.85%29.aspx
>
> IIRC, PeekNamedPipe(h, NULL, 0, NULL, &availsize, NULL) can be used to get
> the available size without blocking.
>
> https://msdn.microsoft.com/en-us/library/windows/desktop/aa365779(v=vs.85).aspx
>
> "The function always returns immediately in a single-threaded application, even
> if there is no data in the pipe. The wait mode of a named pipe handle (blocking
> or nonblocking) has no effect on the function."

Does this mean we should drop this three patches from patchwork and 
expect a V2? Or does the patches looks good the yuya and we should queue 
them?

-- 
Pierre-Yves David



More information about the Mercurial-devel mailing list