@@ -14,6 +14,8 @@ import Data.Int
14import System.Environment (getArgs, withArgs)
14import System.Environment (getArgs, withArgs)
15import Data.Time (getCurrentTime, diffUTCTime)
15import Data.Time (getCurrentTime, diffUTCTime)
16import System.IO (withFile, IOMode(..), hPutStrLn)
16import System.IO (withFile, IOMode(..), hPutStrLn)
17+import Control.Concurrent (forkIO)
18+import Control.Concurrent.MVar (newEmptyMVar, takeMVar, putMVar)
18#ifndef LAZY
20#ifndef LAZY
19import qualified Data.ByteString.Char8 as BS
21import qualified Data.ByteString.Char8 as BS
@@ -50,42 +52,43 @@ decode :: Ser.Serialize a => BS.ByteString -> Either String a
50-- The server must be restarted between benchmarks.
52-- The server must be restarted between benchmarks.
51main :: IO ()
53main :: IO ()
53− args <- getArgs
55+ [pingsStr] <- getArgs
54− case args of
56+ serverReady <- newEmptyMVar
55− "server" : host : service : sourceAddrFilePath : [] -> do
57+
56− -- establish transport
60+ -- establish transport
57− transport <- mkTransport $ TCPConfig defaultHints host service
61+ transport <- mkTransport $ TCPConfig defaultHints "127.0.0.1" "8080"
59− -- create ping end
63+ -- create ping end
60− putStrLn "server: creating ping end"
64+ putStrLn "server: creating ping end"
61− (sourceAddrPing, targetEndPing) <- newConnection transport
65+ (sourceAddrPing, targetEndPing) <- newConnection transport
62− BS.writeFile sourceAddrFilePath $ serialize sourceAddrPing
66+ putMVar serverReady sourceAddrPing
64− -- create pong end
68+ -- create pong end
65− putStrLn "server: creating pong end"
69+ putStrLn "server: creating pong end"
66− [sourceAddrPongBS] <- receive targetEndPing
70+ [sourceAddrPongBS] <- receive targetEndPing
67− sourceEndPong <- connect . fromJust $ deserialize transport sourceAddrPongBS
71+ sourceEndPong <- connect . fromJust $ deserialize transport sourceAddrPongBS
69− -- always respond to a ping with a pong
73+ -- always respond to a ping with a pong
70− putStrLn "server: awaiting pings"
74+ putStrLn "server: awaiting pings"
71− pong targetEndPing sourceEndPong
75+ pong targetEndPing sourceEndPong
74− "client" : host : service : sourceAddrFilePath : pingsStr : [] -> do
78+ sourceAddr <- takeMVar serverReady
75− let pings = read pingsStr
79+ let pings = read pingsStr
76− -- establish transport
80+ -- establish transport
77− transport <- mkTransport $ TCPConfig defaultHints host service
81+ transport <- mkTransport $ TCPConfig defaultHints "127.0.0.1" "8081"
79− -- create ping end
83+ -- create ping end
80− sourceAddrPingBS <- BS.readFile sourceAddrFilePath
81− sourceEndPing <- connect . fromJust $ deserialize transport sourceAddrPingBS
84+ sourceEndPing <- connect sourceAddr
83− -- create pong end
86+ -- create pong end
84− (sourceAddrPong, targetEndPong) <- newConnection transport
87+ (sourceAddrPong, targetEndPong) <- newConnection transport
85− send sourceEndPing [serialize sourceAddrPong]
88+ send sourceEndPing [serialize sourceAddrPong]
87− ping sourceEndPing targetEndPong pings
90+ ping sourceEndPing targetEndPong pings
88− putStrLn "Done with all ping/pongs."
91+ putStrLn "Done with all ping/pongs."
90-- | The message we use to ping (CAF so that we don't keep encoding it)
93-- | The message we use to ping (CAF so that we don't keep encoding it)
91pingMessage :: BS.ByteString
94pingMessage :: BS.ByteString