------------------------------------------------------------------------
-- Registering interest in timeout events
--- | Register a timeout in the given number of milliseconds.
+-- | Register a timeout in the given number of microseconds.
registerTimeout :: EventManager -> Int -> TimeoutCallback -> IO TimeoutKey
-registerTimeout mgr ms cb = do
+registerTimeout mgr us cb = do
!key <- newUnique (emUniqueSource mgr)
- if ms <= 0 then cb
+ if us <= 0 then cb
else do
now <- getCurrentTime
- let expTime = fromIntegral ms / 1000.0 + now
+ let expTime = fromIntegral us / 1000000.0 + now
-- We intentionally do not evaluate the modified map to WHNF here.
-- Instead, we leave a thunk inside the IORef and defer its
wakeManager mgr
updateTimeout :: EventManager -> TimeoutKey -> Int -> IO ()
-updateTimeout mgr (TK key) ms = do
+updateTimeout mgr (TK key) us = do
now <- getCurrentTime
- let expTime = fromIntegral ms / 1000.0 + now
+ let expTime = fromIntegral us / 1000000.0 + now
atomicModifyIORef (emTimeouts mgr) $ \f ->
let f' = (Q.adjust (const expTime) key) . f in (f', ())
labelThread, modifyMVar_, newTVar, sharedCAF,
threadStatus, writeTVar)
import GHC.MVar (MVar, newEmptyMVar, newMVar, putMVar, takeMVar)
-import GHC.Num (fromInteger)
-import GHC.Real (div)
import System.Event.Manager (Event, EventManager, evtRead, evtWrite, loop,
new, registerFd, unregisterFd_, registerTimeout)
import System.IO.Unsafe (unsafePerformIO)
threadDelay usecs = do
Just mgr <- readIORef eventManager
m <- newEmptyMVar
- _ <- registerTimeout mgr (usecs `div` 1000) (putMVar m ())
+ _ <- registerTimeout mgr usecs (putMVar m ())
takeMVar m
-- | Set the value of returned TVar to True after a given number of
registerDelay usecs = do
t <- atomically $ newTVar False
Just mgr <- readIORef eventManager
- _ <- registerTimeout mgr (usecs `div` 1000) . atomically $ writeTVar t True
+ _ <- registerTimeout mgr usecs . atomically $ writeTVar t True
return t
-- | Block the current thread until data is available to read from the