, loop
, step
, shutdown
+ , cleanup
, wakeManager
-- * Registering interest in I/O events
------------------------------------------------------------------------
-- Imports
-import Control.Concurrent.MVar (MVar, modifyMVar, modifyMVar_, newMVar,
- readMVar)
+import Control.Concurrent.MVar (MVar, modifyMVar, newMVar, readMVar)
import Control.Exception (finally)
import Control.Monad ((=<<), forM_, liftM, sequence_, when)
import Data.IORef (IORef, atomicModifyIORef, mkWeakIORef, newIORef, readIORef,
instance Show IOCallback where
show _ = "IOCallback"
+-- | A timeout registration cookie.
newtype TimeoutKey = TK Unique
deriving (Eq)
------------------------------------------------------------------------
-- Event loop
--- | Start handling events. This function loops until told to stop.
+-- | Start handling events. This function loops until told to stop,
+-- using 'shutdown'.
--
-- /Note/: This loop can only be run once per 'EventManager', as it
-- closes all of its control resources when it finishes.
------------------------------------------------------------------------
-- Registering interest in timeout events
--- | Register a timeout in the given number of microseconds.
+-- | Register a timeout in the given number of microseconds. The
+-- returned 'TimeoutKey' can be used to later unregister or update the
+-- timeout. The timeout is automatically unregistered after the given
+-- time has passed.
registerTimeout :: EventManager -> Int -> TimeoutCallback -> IO TimeoutKey
registerTimeout mgr us cb = do
!key <- newUnique (emUniqueSource mgr)
wakeManager mgr
return $ TK key
+-- | Unregister an active timeout.
unregisterTimeout :: EventManager -> TimeoutKey -> IO ()
unregisterTimeout mgr (TK key) = do
atomicModifyIORef (emTimeouts mgr) $ \f ->
let f' = (Q.delete key) . f in (f', ())
wakeManager mgr
+-- | Update an active timeout to fire in the given number of
+-- microseconds.
updateTimeout :: EventManager -> TimeoutKey -> Int -> IO ()
updateTimeout mgr (TK key) us = do
now <- getCurrentTime