@@ -19,15 +19,20 @@ putInt = flip putMVar
19sendInt :: ProcessId -> Int -> Process ()
19sendInt :: ProcessId -> Int -> Process ()
20sendInt = send
20sendInt = send
22+sendPid :: ProcessId -> Process ()
24+ fromPid <- getSelfPid
22−$(remotable ['addInt, 'putInt, 'sendInt])
27+$(remotable ['addInt, 'putInt, 'sendInt, 'sendPid])
24testSendPureClosure :: Transport -> RemoteTable -> IO ()
29testSendPureClosure :: Transport -> RemoteTable -> IO ()
25−testSendPureClosure transport metaData = do
30+testSendPureClosure transport rtable = do
26 serverAddr <- newEmptyMVar
31 serverAddr <- newEmptyMVar
27 serverDone <- newEmptyMVar
32 serverDone <- newEmptyMVar
29 forkIO $ do
34 forkIO $ do
30− node <- newLocalNode transport metaData
35+ node <- newLocalNode transport rtable
31 addr <- forkProcess node $ do
36 addr <- forkProcess node $ do
32 cl <- expect
37 cl <- expect
33 fn <- unClosure cl :: Process (Int -> Int)
38 fn <- unClosure cl :: Process (Int -> Int)
@@ -36,19 +41,19 @@ testSendPureClosure transport metaData = do
36 putMVar serverAddr addr
41 putMVar serverAddr addr
38 forkIO $ do
43 forkIO $ do
39− node <- newLocalNode transport metaData
44+ node <- newLocalNode transport rtable
40 theirAddr <- readMVar serverAddr
45 theirAddr <- readMVar serverAddr
41 runProcess node $ send theirAddr ($(mkClosure 'addInt) 5)
46 runProcess node $ send theirAddr ($(mkClosure 'addInt) 5)
43 takeMVar serverDone
48 takeMVar serverDone
45testSendIOClosure :: Transport -> RemoteTable -> IO ()
50testSendIOClosure :: Transport -> RemoteTable -> IO ()
46−testSendIOClosure transport metaData = do
51+testSendIOClosure transport rtable = do
47 serverAddr <- newEmptyMVar
52 serverAddr <- newEmptyMVar
48 serverDone <- newEmptyMVar
53 serverDone <- newEmptyMVar
50 forkIO $ do
55 forkIO $ do
51− node <- newLocalNode transport metaData
56+ node <- newLocalNode transport rtable
52 addr <- forkProcess node $ do
57 addr <- forkProcess node $ do
53 cl <- expect
58 cl <- expect
54 io <- unClosure cl :: Process (MVar Int -> IO ())
59 io <- unClosure cl :: Process (MVar Int -> IO ())
@@ -60,19 +65,19 @@ testSendIOClosure transport metaData = do
60 putMVar serverAddr addr
65 putMVar serverAddr addr
62 forkIO $ do
67 forkIO $ do
63− node <- newLocalNode transport metaData
68+ node <- newLocalNode transport rtable
64 theirAddr <- readMVar serverAddr
69 theirAddr <- readMVar serverAddr
65 runProcess node $ send theirAddr ($(mkClosure 'putInt) 5)
70 runProcess node $ send theirAddr ($(mkClosure 'putInt) 5)
67 takeMVar serverDone
72 takeMVar serverDone
69testSendProcClosure :: Transport -> RemoteTable -> IO ()
74testSendProcClosure :: Transport -> RemoteTable -> IO ()
70−testSendProcClosure transport metaData = do
75+testSendProcClosure transport rtable = do
71 serverAddr <- newEmptyMVar
76 serverAddr <- newEmptyMVar
72 clientDone <- newEmptyMVar
77 clientDone <- newEmptyMVar
74 forkIO $ do
79 forkIO $ do
75− node <- newLocalNode transport metaData
80+ node <- newLocalNode transport rtable
76 addr <- forkProcess node $ do
81 addr <- forkProcess node $ do
77 cl <- expect
82 cl <- expect
78 pr <- unClosure cl :: Process (Int -> Process ())
83 pr <- unClosure cl :: Process (Int -> Process ())
@@ -80,7 +85,7 @@ testSendProcClosure transport metaData = do
80 putMVar serverAddr addr
85 putMVar serverAddr addr
82 forkIO $ do
87 forkIO $ do
83− node <- newLocalNode transport metaData
88+ node <- newLocalNode transport rtable
84 theirAddr <- readMVar serverAddr
89 theirAddr <- readMVar serverAddr
85 runProcess node $ do
90 runProcess node $ do
86 pid <- getSelfPid
91 pid <- getSelfPid
@@ -90,12 +95,35 @@ testSendProcClosure transport metaData = do
91 takeMVar clientDone
96 takeMVar clientDone
98+testSpawn :: Transport -> RemoteTable -> IO ()
99+testSpawn transport rtable = do
100+ serverNodeAddr <- newEmptyMVar
101+ clientDone <- newEmptyMVar
104+ node <- newLocalNode transport rtable
105+ print (localNodeId node)
106+ putMVar serverNodeAddr (localNodeId node)
109+ node <- newLocalNode transport rtable
110+ nid <- readMVar serverNodeAddr
111+ runProcess node $ do
113+ pid' <- spawn nid ($(mkClosure 'sendPid) pid)
115+ True <- return $ pid' == pid''
116+ liftIO $ putMVar clientDone ()
93main :: IO ()
120main :: IO ()
95 Right transport <- createTransport "127.0.0.1" "8080" defaultTCPParameters
122 Right transport <- createTransport "127.0.0.1" "8080" defaultTCPParameters
96− let metaData = __remoteTable initRemoteTable
123+ let rtable = __remoteTable initRemoteTable
98− [ ("SendPureClosure", testSendPureClosure transport metaData)
125+ [ ("SendPureClosure", testSendPureClosure transport rtable)
99− , ("SendIOClosure", testSendIOClosure transport metaData)
126+ , ("SendIOClosure", testSendIOClosure transport rtable)
100− , ("SendProcClosure", testSendProcClosure transport metaData)
127+ , ("SendProcClosure", testSendProcClosure transport rtable)
128+ , ("Spawn", testSpawn transport rtable)