@@ -19,15 +19,20 @@ putInt = flip putMVar
1919sendInt :: ProcessId -> Int -> Process ()
2020sendInt = send
2121
22−$(remotable ['addInt, 'putInt, 'sendInt])
22+sendPid :: ProcessId -> Process ()
23+sendPid toPid = do
24+ fromPid <- getSelfPid
25+ send toPid fromPid
26+
27+$(remotable ['addInt, 'putInt, 'sendInt, 'sendPid])
2328
2429testSendPureClosure :: Transport -> RemoteTable -> IO ()
25−testSendPureClosure transport metaData = do
30+testSendPureClosure transport rtable = do
2631 serverAddr <- newEmptyMVar
2732 serverDone <- newEmptyMVar
2833
2934 forkIO $ do
30− node <- newLocalNode transport metaData
35+ node <- newLocalNode transport rtable
3136 addr <- forkProcess node $ do
3237 cl <- expect
3338 fn <- unClosure cl :: Process (Int -> Int)
@@ -36,19 +41,19 @@ testSendPureClosure transport metaData = do
3641 putMVar serverAddr addr
3742
3843 forkIO $ do
39− node <- newLocalNode transport metaData
44+ node <- newLocalNode transport rtable
4045 theirAddr <- readMVar serverAddr
4146 runProcess node $ send theirAddr ($(mkClosure 'addInt) 5)
4247
4348 takeMVar serverDone
4449
4550testSendIOClosure :: Transport -> RemoteTable -> IO ()
46−testSendIOClosure transport metaData = do
51+testSendIOClosure transport rtable = do
4752 serverAddr <- newEmptyMVar
4853 serverDone <- newEmptyMVar
4954
5055 forkIO $ do
51− node <- newLocalNode transport metaData
56+ node <- newLocalNode transport rtable
5257 addr <- forkProcess node $ do
5358 cl <- expect
5459 io <- unClosure cl :: Process (MVar Int -> IO ())
@@ -60,19 +65,19 @@ testSendIOClosure transport metaData = do
6065 putMVar serverAddr addr
6166
6267 forkIO $ do
63− node <- newLocalNode transport metaData
68+ node <- newLocalNode transport rtable
6469 theirAddr <- readMVar serverAddr
6570 runProcess node $ send theirAddr ($(mkClosure 'putInt) 5)
6671
6772 takeMVar serverDone
6873
6974testSendProcClosure :: Transport -> RemoteTable -> IO ()
70−testSendProcClosure transport metaData = do
75+testSendProcClosure transport rtable = do
7176 serverAddr <- newEmptyMVar
7277 clientDone <- newEmptyMVar
7378
7479 forkIO $ do
75− node <- newLocalNode transport metaData
80+ node <- newLocalNode transport rtable
7681 addr <- forkProcess node $ do
7782 cl <- expect
7883 pr <- unClosure cl :: Process (Int -> Process ())
@@ -80,7 +85,7 @@ testSendProcClosure transport metaData = do
8085 putMVar serverAddr addr
8186
8287 forkIO $ do
83− node <- newLocalNode transport metaData
88+ node <- newLocalNode transport rtable
8489 theirAddr <- readMVar serverAddr
8590 runProcess node $ do
8691 pid <- getSelfPid
@@ -90,12 +95,35 @@ testSendProcClosure transport metaData = do
9095
9196 takeMVar clientDone
9297
98+testSpawn :: Transport -> RemoteTable -> IO ()
99+testSpawn transport rtable = do
100+ serverNodeAddr <- newEmptyMVar
101+ clientDone <- newEmptyMVar
102+
103+ forkIO $ do
104+ node <- newLocalNode transport rtable
105+ print (localNodeId node)
106+ putMVar serverNodeAddr (localNodeId node)
107+
108+ forkIO $ do
109+ node <- newLocalNode transport rtable
110+ nid <- readMVar serverNodeAddr
111+ runProcess node $ do
112+ pid <- getSelfPid
113+ pid' <- spawn nid ($(mkClosure 'sendPid) pid)
114+ pid'' <- expect
115+ True <- return $ pid' == pid''
116+ liftIO $ putMVar clientDone ()
117+
118+ takeMVar clientDone
119+
93120main :: IO ()
94121main = do
95122 Right transport <- createTransport "127.0.0.1" "8080" defaultTCPParameters
96− let metaData = __remoteTable initRemoteTable
123+ let rtable = __remoteTable initRemoteTable
97124 runTests
98− [ ("SendPureClosure", testSendPureClosure transport metaData)
99− , ("SendIOClosure", testSendIOClosure transport metaData)
100− , ("SendProcClosure", testSendProcClosure transport metaData)
125+ [ ("SendPureClosure", testSendPureClosure transport rtable)
126+ , ("SendIOClosure", testSendIOClosure transport rtable)
127+ , ("SendProcClosure", testSendProcClosure transport rtable)
128+ , ("Spawn", testSpawn transport rtable)
101129 ]