
#8733: I/O manager causes unnecessary syscalls in send/recv loops --------------------------------------------+------------------------------ Reporter: tibbe | Owner: Type: bug | Status: new Priority: normal | Milestone: 7.10.1 Component: Runtime System | Version: 7.6.3 Resolution: | Keywords: Operating System: Unknown/Multiple | Architecture: Type of failure: Runtime performance bug | Unknown/Multiple Test Case: | Difficulty: Unknown Blocking: | Blocked By: | Related Tickets: --------------------------------------------+------------------------------ Comment (by AndreasVoellmy): When you say simplify, what are you comparing to? Is there some implementation of those functions that you are thinking of? Maybe you mean that those functions are implemented in a way similar to the`timeout :: Int -> IO a -> IO (Maybe a)` function in `System.Timeout`. I haven't measured the performance of `timeout` but I imagine it isn't very good, since it forks a new thread in each call. We do have a couple new functions in 7.8 that might allow us to provide a more efficient implementation than something like`timeout` . In 7.8, we have these functions: `threadWaitReadSTM :: Fd -> IO (STM (), IO ())` `threadWaitWriteSTM :: Fd -> IO (STM (), IO ())` They return an STM action that completes whenever the given file is ready to read (or write). Then we can use it in combination with `registerDelay :: Int -> IO (TVar Bool)` to wait on both the file and the timer without spawning a new thread. It would be something like this: {{{#!haskell threadWaitReadWithTimeout :: Fd -> Int -> IO Bool threadWaitReadWithTimeout fd n = do { (ready, _) <- threadWaitReadSTM fd; alarm <- registerDelay n; atomically ((ready >> return True)`orElse` (readTVar alarm >>= check >> return False)) } }}} -- Ticket URL: http://ghc.haskell.org/trac/ghc/ticket/8733#comment:16 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler