llvm-general-3.4.5.3: src/LLVM/General/Internal/Threading.hs
module LLVM.General.Internal.Threading (
setMultithreaded,
isMultithreaded
) where
import LLVM.General.Prelude
import Control.Concurrent.MVar
import System.IO.Unsafe
import qualified LLVM.General.Internal.FFI.Threading as FFI
import LLVM.General.Internal.Coding
lock :: MVar ()
{-# NOINLINE lock #-}
lock = unsafePerformIO $ newMVar ()
-- | Set the multithreading mode of LLVM. If it is disabled (as by default) locks are not enforced.
setMultithreaded :: Bool -> IO ()
setMultithreaded s = do
takeMVar lock
multi <- isMultithreaded
case (s,multi) of
(True,False) -> do
success <- decodeM =<< FFI.startMultithreaded
when (not success) $ error "setMultithreaded: LLVM not built with threading support"
(False,True) -> FFI.stopMultithreaded
_ -> return ()
putMVar lock ()
-- | Check if multithreading is enabled in LLVM
isMultithreaded :: IO Bool
isMultithreaded = FFI.isMultithreaded >>= decodeM