-- | Like Latency, but creating lots of channels
import System.Environment
import Control.Monad
import Control.Applicative
import Control.Distributed.Process
import Control.Distributed.Process.Node
import Network.Transport.TCP (createTransport, defaultTCPParameters)
import Data.Binary (encode, decode)
import qualified Data.ByteString.Lazy as BSL
pingServer :: Process ()
pingServer = forever $ do
them <- expect
sendChan them ()
-- TODO: should this be automatic?
reconnectPort them
pingClient :: Int -> ProcessId -> Process ()
pingClient n them = do
replicateM_ n $ do
(sc, rc) <- newChan :: Process (SendPort (), ReceivePort ())
send them sc
receiveChan rc
liftIO . putStrLn $ "Did " ++ show n ++ " pings"
initialProcess :: String -> Process ()
initialProcess "SERVER" = do
us <- getSelfPid
liftIO $ BSL.writeFile "pingServer.pid" (encode us)
pingServer
initialProcess "CLIENT" = do
n <- liftIO $ getLine
them <- liftIO $ decode <$> BSL.readFile "pingServer.pid"
pingClient (read n) them
main :: IO ()
main = do
[role, host, port] <- getArgs
Right transport <- createTransport host port defaultTCPParameters
node <- newLocalNode transport initRemoteTable
runProcess node $ initialProcess role