Return-Path: Delivered-To: apmail-apr-dev-archive@apr.apache.org Received: (qmail 88458 invoked by uid 500); 12 Dec 2002 13:40: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 88444 invoked from network); 12 Dec 2002 13:40:28 -0000 From: "Bill Stoddard" To: "APR Development List" Subject: RE: Tests hanging on Windows Date: Thu, 12 Dec 2002 08:01:22 -0500 Message-ID: MIME-Version: 1.0 Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit X-Priority: 3 (Normal) X-MSMail-Priority: Normal X-Mailer: Microsoft Outlook IMO, Build 9.0.2416 (9.0.2911.0) In-Reply-To: X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2600.0000 Importance: Normal X-Spam-Rating: daedalus.apache.org 1.6.2 0/1000/N > 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. Bill