{-# 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