git.iko.soy/distributed-process
on master help sign in
Close connections on process exit
f75f59cEdsko de Vries
distributed-process/src/Control/Distributed/Process/Node.hs+9−10
@@ -25,6 +25,7 @@ import qualified Data.Map as Map
25 , toList
25 , toList
26 , partitionWithKey
26 , partitionWithKey
27 , filterWithKey
27 , filterWithKey
28+ , elems
28 )
29 )
29import Data.Set (Set)
30import Data.Set (Set)
30import qualified Data.Set as Set (empty, insert, delete, member, filter)
31import qualified Data.Set as Set (empty, insert, delete, member, filter)
@@ -65,6 +66,7 @@ import qualified Network.Transport as NT
65 , closeEndPoint
66 , closeEndPoint
66 , ConnectionId
67 , ConnectionId
67 , Connection
68 , Connection
69+ , close
68 )
70 )
69import Data.Accessor (Accessor, accessor, (^.), (^=), (^:))
71import Data.Accessor (Accessor, accessor, (^.), (^=), (^:))
70import qualified Data.Accessor.Container as DAC (mapDefault, mapMaybe)
72import qualified Data.Accessor.Container as DAC (mapDefault, mapMaybe)
@@ -214,9 +216,13 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
214 (runLocalProcess lproc proc >> return DiedNormal)
216 (runLocalProcess lproc proc >> return DiedNormal)
215 (return . DiedException . (show :: SomeException -> String))
217 (return . DiedException . (show :: SomeException -> String))
216 -- [Unified: Table 4, rules termination and exiting]
218 -- [Unified: Table 4, rules termination and exiting]
217− modifyMVar_ (localState node) $
219+ modifyMVar_ (localState node) $ \st -> do
220+ let pid' = ProcessIdentifier pid
221+ let (affected, unaffected) = Map.partitionWithKey (\(fr, _to) !_v -> impliesDeathOf pid' fr) (st ^. localConnections)
222+ mapM_ NT.close (Map.elems affected)
218− return . (localProcessWithId lpid ^= Nothing)
223+ return $ (localProcessWithId lpid ^= Nothing)
219− . (localConnections ^: removeConnectionsFrom (ProcessIdentifier pid))
224+ . (localConnections ^= unaffected)
225+ $ st
220 writeChan (localCtrlChan node) NCMsg
226 writeChan (localCtrlChan node) NCMsg
221 { ctrlMsgSender = ProcessIdentifier pid
227 { ctrlMsgSender = ProcessIdentifier pid
222 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
228 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
@@ -239,13 +245,6 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
239 , pid
245 , pid
240 )
246 )
241
247
242−-- | Remove connections from 'ident' (typically because 'ident' has terminated)
243−removeConnectionsFrom :: Identifier
244− -> Map (Identifier, Identifier) NT.Connection
245− -> Map (Identifier, Identifier) NT.Connection
246−removeConnectionsFrom ident =
247− Map.filterWithKey $ \(fr, _to) _conn -> fr /= ident
248−
249handleIncomingMessages :: LocalNode -> IO ()
248handleIncomingMessages :: LocalNode -> IO ()
250handleIncomingMessages node = go Set.empty Map.empty Map.empty Set.empty
249handleIncomingMessages node = go Set.empty Map.empty Map.empty Set.empty
251 where
250 where