This is the mail archive of the cygwin-developers@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

possible explanation for make hang


I don't know precisely what make is doing but it is possible that
if more than one program is attempting to read from the same pipe
there will be a race that will cause cygwin to block in an uninterruptible
read.  So, if something like a SIGCHLD comes in while cygwin is reading
a pipe it won't be possible to deal with it.  I'm not aware of any
way to interrupt a blocking read on a pipe so cygwin will hang until
something shows up on the pipe.

I just had this happen to me after 57 iterations of make in the winsup
directory.  The stack traces of the affected makes seemed to indicate
that this is what is happening.

I *really* wish I knew of another way to deal with interrupting reads
than the kludge that is now in use but I don't.

I thought I had a promising lead a few weeks ago but the Windows API
stood staunchly in my path, as usual.

Actually, I did have another method for interrupting blocking reads in
cygwin at one point.  I used to start a new thread for every read on a
slow device (such as a pipe) and then call TerminateThread when a signal
came in.  This approach was met with great horror by other developers
when I first started at Cygnus so I reverted it to the current
infinitesimally less kludgey approach of (for pipes) polling using
PeekNamedPipe for input.

The PeekNamedPipe has some drawbacks.  It can actually block in some
situations and it doesn't detect EOF on Windows 95.

Basically, I hate Windows pipes.

cgf


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]