git.iko.soy/distributed-process
on master help sign in
Handle exceptions in N.T.Util.spawn
42d3054Edsko de Vries
network-transport/src/Network/Transport/Util.hs+13−5
@@ -9,6 +9,7 @@ import Network.Transport
9 , EndPointAddress
9 , EndPointAddress
10 , newEndPoint
10 , newEndPoint
11 )
11 )
12+import Control.Exception (throwIO)
12import Control.Concurrent (forkIO)
13import Control.Concurrent (forkIO)
13import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
14import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
14
15
@@ -17,9 +18,16 @@ import Control.Concurrent.MVar (newEmptyMVar, putMVar, takeMVar)
17-- Returns the address of the new end point.
18-- Returns the address of the new end point.
18spawn :: Transport -> (EndPoint -> IO ()) -> IO EndPointAddress
19spawn :: Transport -> (EndPoint -> IO ()) -> IO EndPointAddress
19spawn transport proc = do
20spawn transport proc = do
20− addr <- newEmptyMVar
21+ addrMVar <- newEmptyMVar
21 forkIO $ do
22 forkIO $ do
22− Right endpoint <- newEndPoint transport
23+ mEndPoint <- newEndPoint transport
23− putMVar addr (address endpoint)
24+ case mEndPoint of
24− proc endpoint
25+ Left err ->
26+ putMVar addrMVar (Left err)
27+ Right endPoint -> do
28+ putMVar addrMVar (Right (address endPoint))
29+ proc endPoint
25− takeMVar addr
30+ mAddr <- takeMVar addrMVar
31+ case mAddr of
32+ Left err -> throwIO err
33+ Right addr -> return addr