packages feed

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