packages feed

acid-state-dist-0.1.0.0: benchmark/Slave.hs

{-# LANGUAGE TypeFamilies #-}

import Criterion.Main

import Data.Acid
import Data.Acid.Centered

import System.Exit (exitSuccess)
import Control.Monad (void)
import Control.Concurrent (forkIO)
import Control.Concurrent.MVar (MVar, newEmptyMVar, putMVar, takeMVar)

-- common benchmarking stuff
import BenchCommon

-- the master
master :: MVar () -> IO ()
master sync = do
    acid <- openMasterStateFrom "state/Slave/m" "127.0.0.1" 3333 (IntState 0)
    takeMVar sync
    closeAcidState acid

main :: IO ()
main = do
    -- init acid
    cleanup "state/Slave"
    sync <- newEmptyMVar
    void $ forkIO $ master sync
    acid <- enslaveStateFrom "state/Slave/s1" "localhost" 3333 (IntState 0)
    delaySec 3

    -- run benchmark
    defaultMain
        [ bench "Slave" $ nfIO (slaveBench acid)
        , bench "Slave-grouped" $ nfIO (slaveBenchGrouped acid)
        ]

    -- cleanup
    delaySec 5
    closeAcidState acid
    putMVar sync ()
    exitSuccess