
Bardur Arantsson wrote: (sorry about replying-to-self)
During yet another bout of debugging, I've added even more "I am here" instrumentation code to the SendFile code, and the culprit seems to be threadWaitWrite.
I think I've pretty much confirmed this. I've changed the code again. This time to:
sendfile :: Fd -> Fd -> Ptr Int64 -> Int64 -> IO Int64 sendfile out_fd in_fd poff bytes = do putStrLn "PRE-threadWaitWrite" -- threadWaitWrite out_fd -- putStrLn "AFTER threadWaitWrite" sbytes <- c_sendfile out_fd in_fd poff (fromIntegral bytes) putStrLn $ "AFTER c_sendfile; result was: " ++ (show sbytes) if sbytes <= -1 then do errno <- getErrno if errno == eAGAIN then do threadDelay 100 sendfile out_fd in_fd poff bytes else throwErrno "Network.Socket.SendFile.Linux" else return (fromIntegral sbytes)
That is, I removed the threadWaitWrite in favor of just adding a "threadDelay 100" when eAGAIN is encountered. With this code, I cannot provoke the leak. Unfortunately this isn't really a solution -- the CPU is pegged at ~50% when I do this and it's not exactly elegant to have a hardcoded 100 ms delay in there. :) I'm hoping that someone who understands the internals of GHC can chime in here with some kind of explanation as to if/why/how threadWaitWrite can fail in this way. Anyone? Cheers,