Hi all,

I'm trying to run a loop that repeatedly attempts to open a file until it succeeds.  The file is a named pipe in nonblocking mode, so the writer can only connect after the reader has connected.  (Perhaps there is some way to determine this by stat'ing the pipe, but I don't know it yet.)

Thus I do something like the following:

 tryUntilNoIOErr $ do
    performGC
    -- The reader must connect first, the writer here spins with backoff.
    PIO.openFd filename PIO.WriteOnly Nothing fileFlags

I'm running GC between iterations to try to make sure I get rid of open files.  Also, in the "tryUntilNoIOErr" code below I have some debugging messages which indicate that ioeGetHandle reports no handles associated with the exceptions I'm getting back.  (If there were handles provided I could close them explicitly.)

In spite of these attempted precautions I'm seeing "too many open files" exceptions in simple benchmarks that should only have a maximum of ONE file open. 

Any hints / pointers?

Thanks,
  -Ryan


mkBackoff :: IO (IO ())
mkBackoff =
  do tref <- newIORef 1
     return$ do t <- readIORef tref
        writeIORef tref (min maxwait (2 * t))
        threadDelay t
 where
   maxwait = 50 * 1000

tryUntilNoIOErr :: IO a -> IO a
tryUntilNoIOErr action = mkBackoff >>= loop
 where
  loop bkoff =
    handle (\ (e :: IOException) ->
         do bkoff
                BSS.hPutStr stderr$ BSS.pack$ "    got IO err: " ++ show e
            case ioeGetHandle e of
              Nothing -> BSS.hPutStrLn stderr$ BSS.pack$ "  no hndl io err."
              Just x  -> BSS.hPutStrLn stderr$ BSS.pack$ "  HNDL on io err!" ++ show x
            loop bkoff) $
       action