apr-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Stoddard" <b...@wstoddard.com>
Subject RE: Tests hanging on Windows
Date Thu, 12 Dec 2002 13:01:22 GMT
> On Wed, 11 Dec 2002 rbb@apache.org wrote:
> >
> > The tests currently hang in testpipe on Windows.  The problem is the test
> > that tries to read from the pipe with a timeout.  The test doesn't write
> > anything to the pipe before reading, although it does set a 1 second
> > timeout.  However, on Windows, the pipe timeout is never popping.  I
> > haven't had much time to debug, so if another Windows person wants to look
> > at it.  This should be an easy one to debug quickly.
> I've done more research.  Wow, this is ugly.  Basically, Windows doesn't
> allow you to open anonymous pipes in a non-blocking mode.  That means that
> it is impossible to timeout a pipe read/write.  Now for the good news.
> There are two possible solutions.
> 1)  Switch to using named pipes for platforms that support them.  This has
> the advantage that we can open the pipe in overlapped mode, but it won't
> work on older versions of Windows (9x, ME specifically).  This also means
> that APR itself will have a need to get a temporary filename, because we
> will need to have a name for the named pipe, but we can essentially forget
> the name of the pipe immediately.
> 2)  The second option is to do what cygwin does.  Namely, instead of
> calling ReadFile on the pipe, call PeekNamedPipe repeatedly until there is
> data or the timeout pops.  This is moderately ugly, because it means that
> we won't see the data as soon as it is available to be read.  It also
> means that an idle process that is just reading on the pipe will actually
> take some resources occaisionally (I would assume once every second or so)
> to check if there has been any activity.
> Does anybody have any opinions?  I can't believe that we have gone this
> long without timeouts working on pipes on Windows.

Take a look at file_io/win32/readwrite.c. Search for PeekNamedPipe.  Then take a
peek at apr_create_nt_pipe in pipe.c.  This is the function that you are looking
for and it needs to be exposed in a more generally useful and portable way.


View raw message