@@ -65,6 +65,7 @@ import qualified Network.Transport as NT
6565 , address
6666 , closeEndPoint
6767 , ConnectionId
68+ , Connection
6869 )
6970import Data.Accessor (Accessor, accessor, (^.), (^=), (^:))
7071import qualified Data.Accessor.Container as DAC (mapDefault, mapMaybe)
@@ -89,6 +90,7 @@ import Control.Distributed.Process.Internal.Types
8990 , localPidCounter
9091 , localPidUnique
9192 , localProcessWithId
93+ , localConnections
9294 , MonitorRef(..)
9395 , ProcessMonitorNotification(..)
9496 , NodeMonitorNotification(..)
@@ -214,6 +216,7 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
214216 -- [Unified: Table 4, rules termination and exiting]
215217 modifyMVar_ (localState node) $
216218 return . (localProcessWithId lpid ^= Nothing)
219+ . (localConnections ^: removeConnectionsFrom (ProcessIdentifier pid))
217220 writeChan (localCtrlChan node) NCMsg
218221 { ctrlMsgSender = ProcessIdentifier pid
219222 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
@@ -236,6 +239,13 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
236239 , pid
237240 )
238241
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+
239249handleIncomingMessages :: LocalNode -> IO ()
240250handleIncomingMessages node = go [] Map.empty Map.empty Set.empty
241251 where