ekg-core-0.1.2.0: benchmarks/Counter.hs
{-# LANGUAGE BangPatterns, OverloadedStrings #-}
-- | Perform 100,000 atomic increments using 100 concurrent writers.
module Main where
import Control.Concurrent
import Control.Monad
import qualified System.Metrics.Counter as C
main :: IO ()
main = do
counter <- C.new
locks <- replicateM n newEmptyMVar
mapM_ (forkIO . work counter iters) locks
mapM_ takeMVar locks
fin <- C.read counter
when (fin /= fromIntegral (n * iters)) $
fail "Data.Atomic is broken!"
where
n = 100
iters = 100000
work :: C.Counter -> Int -> MVar () -> IO ()
work !_ 0 !lock = putMVar lock ()
work counter i lock = C.inc counter >> work counter (i - 1) lock