@@ -65,6 +65,7 @@ import qualified Network.Transport as NT
66 , closeEndPoint
66 , closeEndPoint
67 , ConnectionId
67 , ConnectionId
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
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
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
239handleIncomingMessages :: LocalNode -> IO ()
249handleIncomingMessages :: LocalNode -> IO ()
240handleIncomingMessages node = go [] Map.empty Map.empty Set.empty
250handleIncomingMessages node = go [] Map.empty Map.empty Set.empty