blob: 14f3dda42f11d3ae580593b038cc8ccd0d8e6ff6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
{-# LANGUAGE NoImplicitPrelude #-}
module GHC.Event.Windows.Thread (
ensureIOManagerIsRunning,
interruptIOManager,
threadDelay,
registerDelay,
) where
import GHC.Conc.Sync
import GHC.Base
import GHC.Event.Windows
import GHC.IO
import GHC.IOPort
ensureIOManagerIsRunning :: IO ()
ensureIOManagerIsRunning = wakeupIOManager
interruptIOManager :: IO ()
interruptIOManager = interruptSystemManager
-- | Be careful not to exceed @maxBound :: Int@, which on 32-bit machines is only
-- 2147483647 μs, less than 36 minutes.
threadDelay :: Int -> IO ()
threadDelay usecs = mask_ $ do
m <- newEmptyIOPort
mgr <- getSystemManager
reg <- registerTimeout mgr usecs $ writeIOPort m () >> return ()
readIOPort m `onException` unregisterTimeout mgr reg
-- | Be careful not to exceed @maxBound :: Int@, which on 32-bit machines is only
-- 2147483647 μs, less than 36 minutes.
registerDelay :: Int -> IO (TVar Bool)
registerDelay usecs = do
t <- newTVarIO False
mgr <- getSystemManager
_ <- registerTimeout mgr usecs $ atomically $ writeTVar t True
return t
|