[Haskell-cafe] Optimizing a high-traffic network architecture

Joel Reymont joelr1 at gmail.com
Thu Dec 15 05:09:32 EST 2005


Something like this. If someone inserts a timer while we are doing  
our checking we can always catch it on the next iteration of the loop.

--- Now runs unblocked
checkTimers :: IO ()
checkTimers =
     do t <- readMVar timers -- takes it and puts it back
        case M.size t of
          -- no timers
          0 -> threadDelay timeout
          -- some timers
          n -> do let (key@(time, name), io) = M.findMin t
                  now <- getClockTime
                  if (time <= now)
                     then do modifyMVar_ timers $ \a ->
                                 return $! M.delete key a
                             try $ io -- don't think we care
                             return ()
                     else threadDelay timeout
        checkTimers

On Dec 15, 2005, at 9:39 AM, Tomasz Zielonka wrote:

> Perhaps you could use modifyMVar:
>
> http://www.haskell.org/ghc/docs/latest/html/libraries/base/Control- 
> Concurrent-MVar.html#v%3AmodifyMVar
>
>   modifyMVar_ :: MVar a -> (a -> IO a) -> IO ()
>
>   A safe wrapper for modifying the contents of an MVar. Like withMVar,
>   modifyMVar will replace the original contents of the MVar if an
>   exception is raised during the operation.

--
http://wagerlabs.com/







More information about the Haskell-Cafe mailing list