git.iko.soy/distributed-process
on master help sign in
Clean up localConnections on process termination
2573b85Edsko de Vries
distributed-process/src/Control/Distributed/Process/Node.hs+10
@@ -65,6 +65,7 @@ import qualified Network.Transport as NT
65 , address
65 , address
66 , closeEndPoint
66 , closeEndPoint
67 , ConnectionId
67 , ConnectionId
68+ , Connection
68 )
69 )
69import Data.Accessor (Accessor, accessor, (^.), (^=), (^:))
70import Data.Accessor (Accessor, accessor, (^.), (^=), (^:))
70import qualified Data.Accessor.Container as DAC (mapDefault, mapMaybe)
71import qualified Data.Accessor.Container as DAC (mapDefault, mapMaybe)
@@ -89,6 +90,7 @@ import Control.Distributed.Process.Internal.Types
89 , localPidCounter
90 , localPidCounter
90 , localPidUnique
91 , localPidUnique
91 , localProcessWithId
92 , localProcessWithId
93+ , localConnections
92 , MonitorRef(..)
94 , MonitorRef(..)
93 , ProcessMonitorNotification(..)
95 , ProcessMonitorNotification(..)
94 , NodeMonitorNotification(..)
96 , NodeMonitorNotification(..)
@@ -214,6 +216,7 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
214 -- [Unified: Table 4, rules termination and exiting]
216 -- [Unified: Table 4, rules termination and exiting]
215 modifyMVar_ (localState node) $
217 modifyMVar_ (localState node) $
216 return . (localProcessWithId lpid ^= Nothing)
218 return . (localProcessWithId lpid ^= Nothing)
219+ . (localConnections ^: removeConnectionsFrom (ProcessIdentifier pid))
217 writeChan (localCtrlChan node) NCMsg
220 writeChan (localCtrlChan node) NCMsg
218 { ctrlMsgSender = ProcessIdentifier pid
221 { ctrlMsgSender = ProcessIdentifier pid
219 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
222 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
@@ -236,6 +239,13 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
236 , pid
239 , pid
237 )
240 )
238
241
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+
239handleIncomingMessages :: LocalNode -> IO ()
249handleIncomingMessages :: LocalNode -> IO ()
240handleIncomingMessages node = go [] Map.empty Map.empty Set.empty
250handleIncomingMessages node = go [] Map.empty Map.empty Set.empty
241 where
251 where