@@ -70,9 +70,9 @@ import Control.Monad.Trans.Control (ComposeSt, MonadBaseControl (..),
7070 MonadTransControl (..),
7171 defaultLiftBaseWith,
7272 defaultRestoreM, liftBaseWith)
73−import Data.IORef (IORef, atomicModifyIORef,
74− modifyIORef, newIORef, readIORef,
75− writeIORef)
73+import Data.Atomics (atomicModifyIORefCAS)
74+import Data.IORef (IORef, modifyIORef, newIORef,
75+ readIORef, writeIORef)
7676import Data.List (delete)
7777import Data.Maybe (isJust)
7878import GHC.Prim (Any)
@@ -338,13 +338,13 @@ waitForOneEvent ctx = do
338338-- instead it returns whether the value is zero or non-zero.
339339--
340340waitQSemB :: IORef Int -> IO Bool
341−waitQSemB sem = atomicModifyIORef sem $ \n ->
341+waitQSemB sem = atomicModifyIORefCAS sem $ \n ->
342342 if n > 0
343343 then (n - 1, True)
344344 else (n, False)
345345
346346signalQSemB :: IORef Int -> IO ()
347−signalQSemB sem = atomicModifyIORef sem $ \n -> (n + 1, ())
347+signalQSemB sem = atomicModifyIORefCAS sem $ \n -> (n + 1, ())
348348
349349-- Allocation of threads
350350--
@@ -361,6 +361,7 @@ signalQSemB sem = atomicModifyIORef sem $ \n -> (n + 1, ())
361361-- high.
362362--
363363
364+{-# INLINE handleResult #-}
364365handleResult :: MonadIO m
365366 => Context -> Either SomeException a -> m (Maybe SomeException)
366367handleResult ctx res =
@@ -376,7 +377,7 @@ handleResult ctx res =
376377 where
377378
378379 handleRecording recording ref = do
379− liftIO $ atomicModifyIORef ref $ \logs -> (recording : logs, ())
380+ liftIO $ atomicModifyIORefCAS ref $ \logs -> (recording : logs, ())
380381 waitForChildren ctx
381382
382383 passException e = do