On Mon, Mar 07, 2011 at 11:39:51AM +0100, Corinna Vinschen wrote: >On Mar 5 21:12, Robert Wruck wrote: >> Hi, >> >> recently, I found that cygwin-git was not able to 'cat-file' files >> that exceeded some size (in my case about 80MB). >> I tracked this down to the cygwin implementation of write() that >> behaves quite odd in some cases. >> >> I wrote a small program (source attached) that mmaps a given file >> and tries to write it to another file or stdout. >> >> The results vary: >> >> If the destination is a file (`writetest infile outfile` or >> `writetest infile > outfile`), the write succeeds in a single call. >> >> If the destination is a pipe (`writetest infile | cat > outfile`), >> the write succeeds in most cases. BUT: >> >> Under WinXP (XP Service Pack 2, 32bit), the call returns -1 and >> errno=EAGAIN. Nevertheless, SOME data is written to the pipe (in my >> case 4096 byte for each call). >> This breaks git since it does an infinite loop while errno=EAGAIN. > >Hang on, you are saying that a *blocking* write(2) to a pipe returns >with EAGAIN? Are you sure? It would be quite a surprise if git would >actually do that. EAGAIN is only an expected error for non-blocking >I/O, so applications which use blocking I/O usually only test for EINTR.
I can barely convince myself that there's a pathological case where an EAGAIN could leak out. I'm investigating now. cgf -- Problem reports: http://cygwin.com/problems.html FAQ: http://cygwin.com/faq/ Documentation: http://cygwin.com/docs.html Unsubscribe info: http://cygwin.com/ml/#unsubscribe-simple