summaryrefslogtreecommitdiff
path: root/testsuite/tests/rts/T15427.hs
blob: d4af150106f83d76a201267b896a3133a4e3d951 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
import Control.Concurrent.MVar
import Control.Monad
import Foreign.C.Types (CInt(..))
import Foreign.StablePtr (StablePtr)
import GHC.Conc

foreign import ccall unsafe hs_try_putmvar :: CInt -> StablePtr PrimMVar -> IO ()

main = do
  mvs <- forM [0..numCapabilities] (\idx -> do
                                         a <- newEmptyMVar
                                         b <- newEmptyMVar
                                         return $ (idx, a, b))
  forM_ [mvs, reverse mvs] $ \mvars -> do
    forM_ mvars $ (\(cap,a,b) -> forkOn cap $ do
                      takeMVar a
                      putMVar b ())
    forM_ mvars $ \(cap, a, _) -> do
      sp <- newStablePtrPrimMVar a
      hs_try_putmvar (fromIntegral cap) sp
    forM_ mvars $ \(_,_,b) -> takeMVar b