{-# LANGUAGE MultiParamTypeClasses, PatternSignatures, TypeSynonymInstances, FlexibleInstances #-} -- creating some n number of actors which pass around some message module Main where import IO import Monad import Data.IORef import Control.Concurrent import System.Environment import Data.Time import Actor.ActorBase import Actor.ActorSyntax import Actor.ActorCompiler import Actor.ActorLinearSearch -- boilerplate data Msg = Blah deriving (Eq,Show) valhashOp = HashOp { numberOfTables = 1, hashMsg = \ _ -> 1 } instance EMatch Msg where match tags m1 m2 = return (m1 == m2, tags) -- auxilliary loop c = do { c; loop c} ifonly b c = if b then c else return () -- actual actor code toPID = actorToPID chainedActor idx max exit neighbor self = do { loop ( do { --putStrLn ("Actor " ++ show idx ++ ": WAITING"); receive self [ [Blah] .->. ( do { --putStrLn ("Actor " ++ show idx ++ ": RECEIVED"); if idx == max then putMVar exit () -- EXIT else send (toPID neighbor) Blah } ) ] } ) } createActors :: Int -> Int -> MVar () -> Act Msg -> IO () createActors idx max exit curr | idx == max = runActor curr (chainedActor idx max exit curr) -- last actor won't sent, only performs exit | idx < max = do { (next :: Act Msg) <- createActor valhashOp ; runActor curr (chainedActor idx max exit next) ; createActors (idx+1) max exit next } main :: IO () main = do { let n = 50000 ; exit <- newEmptyMVar ; start <- getCurrentTime ; (initialActor :: Act Msg) <- createActor valhashOp ; createActors 1 n exit initialActor ; end <- getCurrentTime ; putStrLn $ "creation time: " ++ show (diffUTCTime end start) ; send (toPID initialActor) Blah ; readMVar exit -- blocks till done ; fin <- getCurrentTime ; putStrLn $ "message time: " ++ show (diffUTCTime fin end) ; putStrLn $ "Threads: " ++ show n }