summaryrefslogtreecommitdiff
path: root/testsuite/tests/concurrent/should_run/compareAndSwap.hs
diff options
context:
space:
mode:
Diffstat (limited to 'testsuite/tests/concurrent/should_run/compareAndSwap.hs')
-rw-r--r--testsuite/tests/concurrent/should_run/compareAndSwap.hs78
1 files changed, 0 insertions, 78 deletions
diff --git a/testsuite/tests/concurrent/should_run/compareAndSwap.hs b/testsuite/tests/concurrent/should_run/compareAndSwap.hs
deleted file mode 100644
index ac6c6b1965..0000000000
--- a/testsuite/tests/concurrent/should_run/compareAndSwap.hs
+++ /dev/null
@@ -1,78 +0,0 @@
-{-# Language MagicHash, UnboxedTuples #-}
-
--- | Note: extensive testing of atomic operations is performed in the
--- "atomic-primops" library. Only extremely rudimentary tests appear
--- here.
-
-import GHC.IO
-import GHC.IORef
-import GHC.ST
-import GHC.STRef
-import GHC.Prim
-import GHC.Base
-import Data.Primitive.Array
-import Data.IORef
-import Control.Monad
-
-------------------------------------------------------------------------
-
-casArrayST :: MutableArray s a -> Int -> a -> a -> ST s (Bool, a)
-casArrayST (MutableArray arr#) (I# i#) old new = ST$ \s1# ->
- case casArray# arr# i# old new s1# of
- (# s2#, x#, res #) -> (# s2#, (isTrue# (x# ==# 0#), res) #)
-
-casSTRef :: STRef s a -- ^ The 'STRef' containing a value 'current'
- -> a -- ^ The 'old' value to compare
- -> a -- ^ The 'new' value to replace 'current' if @old == current@
- -> ST s (Bool, a)
-casSTRef (STRef var#) old new = ST $ \s1# ->
- -- The primop treats the boolean as a sort of error code.
- -- Zero means the CAS worked, one that it didn't.
- -- We flip that here:
- case casMutVar# var# old new s1# of
- (# s2#, x#, res #) -> (# s2#, (isTrue# (x# ==# 0#), res) #)
-
--- | Performs a machine-level compare and swap operation on an
--- 'IORef'. Returns a tuple containing a 'Bool' which is 'True' when a
--- swap is performed, along with the 'current' value from the 'IORef'.
---
--- Note \"compare\" here means pointer equality in the sense of
--- 'GHC.Prim.reallyUnsafePtrEquality#'.
-casIORef :: IORef a -- ^ The 'IORef' containing a value 'current'
- -> a -- ^ The 'old' value to compare
- -> a -- ^ The 'new' value to replace 'current' if @old == current@
- -> IO (Bool, a)
-casIORef (IORef var) old new = stToIO (casSTRef var old new)
-
-
-------------------------------------------------------------------------
--- Make sure this Int corresponds to a single object in memory (NOINLINE):
-{-# NOINLINE mynum #-}
-mynum :: Int
-mynum = 33
-
-main = do
- putStrLn "Perform a CAS within an IORef"
- ref <- newIORef mynum
- res <- casIORef ref mynum 44
- res2 <- casIORef ref mynum 44
- putStrLn$ " 1st try should succeed: "++show res
- putStrLn$ " 2nd should fail: "++show res2
-
- ------------------------------------------------------------
- putStrLn "Perform a CAS within a MutableArray#"
- arr <- newArray 5 mynum
-
- res <- stToIO$ casArrayST arr 3 mynum 44
- res2 <- stToIO$ casArrayST arr 3 mynum 44
- putStrLn$ " 1st try should succeed: "++show res
- putStrLn$ " 2nd should fail: "++show res2
-
- putStrLn "Printing array:"
- forM_ [0..4] $ \ i -> do
- x <- readArray arr i
- putStr (" "++show x)
- putStrLn ""
-
- ------------------------------------------------------------
- putStrLn "Done."