From dev-return-8704-apmail-apr-dev-archive=apr.apache.org@apr.apache.org Thu Dec 12 16:28:30 2002 Return-Path: Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 65341 invoked by uid 500); 12 Dec 2002 16:28:29 -0000 Mailing-List: contact dev-help@apr.apache.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Unsubscribe: List-Subscribe: Delivered-To: mailing list dev@apr.apache.org Received: (qmail 65321 invoked from network); 12 Dec 2002 16:28:28 -0000 Date: Thu, 12 Dec 2002 08:35:13 -0800 (PST) From: X-X-Sender: To: Bill Stoddard cc: APR Development List Subject: RE: Tests hanging on Windows In-Reply-To: Message-ID: MIME-Version: 1.0 Content-Type: TEXT/PLAIN; charset=US-ASCII X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N On Thu, 12 Dec 2002, Bill Stoddard wrote: > > 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. This is the function that should be used for apr_create_pipe on NT-based platforms. That would have solved this problem cleanly. I'll try to create a patch sometime tonight. Ryan