rsync over ssh hang issue understood

Corinna Vinschen
Fri Jun 30 09:22:00 GMT 2006

On Jun 29 22:01, Lev Bishop wrote:
> On 6/29/06, Darryl Miles wrote:
> >I also think from reading through the WIN32 API that I either get
> >blocking IO or overlapped IO, where overlapped is non-blocking with
> >async I/O completion signaling.  This mode isn't directly compatible
> >with non-blocking of Unix the way I see it as the data is still queued
> >into the kernel for IO.  Not next left with the application in the case
> >of errno=EAGAIN of unix.
> Actually, the data is left with the application, but the application
> is not allowed to touch it until the write has completed. It's very
> similar to UNIX asynchronous IO (aio_read() aio_write() et al).
> However for pipes (and only for pipes) the windows API offers
> something a lot like UNIX nonblocking semantics. It's only supported
> to provide Lan Manager 2.0 compatibility and MSDN says should never be
> used. Look at SetNamedPipeHandleState() with the PIPE_NOWAIT flag.
> Unlike Overlapped IO (see below) the PIPE_NOWAIT flag can be switched
> on and off at will, it seems, so maybe there's a way to use it to do
> what you want.

There's a tiny problem with overlapped I/O which spoils the fun a bit.

2 years ago I had socket I/O implemented using overlapped I/O to get
socket I/O interuptible by signals.  It worked quite nicely, up to the
point where the call was actually interrupted by a signal, the
overlapped call hadn't finshed, and CancelIO had to be called to
interrupt the action.  The problem is this:  There's no way to find
out how many bytes actually were transmitted in case of canceling the
Winsock send() call.

Cygwin's send() could only return -1/EINTR, so the application assumed
that the data has to be completely retransmit and called send() again
with the full block of data.  Out of sync, too bad.

I can easily imagine that we could get the same problem with pipes.
You can argue that the overlapped I/O should never get canceled and
that send() should always return as if all data has been send.  The next
send() then has to wait until the previously started overlapped I/O
gets finished, returning -1 on signal.  But what if the still running
overlapped I/O from the previosuly called send() returns with error?
Out of sync again.


Corinna Vinschen                  Please, send mails regarding Cygwin to
Cygwin Project Co-Leader          cygwin AT cygwin DOT com
Red Hat

Unsubscribe info:
Problem reports:

More information about the Cygwin mailing list