@@ -14,8 +14,8 @@ import Prelude hiding (catch)
16import System.IO (fixIO, hPutStrLn, stderr)
16import System.IO (fixIO, hPutStrLn, stderr)
17−import qualified Data.ByteString.Lazy as BSL (fromChunks)
17+import qualified Data.NotByteString.Lazy as BSL (fromChunks)
18−import Data.Binary (decode)
18+import Data.NotByteString.Lazy.Binary (decode)
19import Data.Map (Map)
19import Data.Map (Map)
20import qualified Data.Map as Map
20import qualified Data.Map as Map
@@ -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(..)
@@ -119,6 +121,7 @@ import Control.Distributed.Process.Internal.Node
119 ( sendBinary
121 ( sendBinary
120 , sendMessage
122 , sendMessage
121 , sendPayload
123 , sendPayload
123import Control.Distributed.Process.Internal.Primitives (expect, register, finally)
126import Control.Distributed.Process.Internal.Primitives (expect, register, finally)
124import qualified Control.Distributed.Process.Internal.Closure.BuiltIn as BuiltIn (remoteTable)
127import qualified Control.Distributed.Process.Internal.Closure.BuiltIn as BuiltIn (remoteTable)
@@ -214,6 +217,7 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
214 -- [Unified: Table 4, rules termination and exiting]
217 -- [Unified: Table 4, rules termination and exiting]
215 modifyMVar_ (localState node) $
218 modifyMVar_ (localState node) $
216 return . (localProcessWithId lpid ^= Nothing)
219 return . (localProcessWithId lpid ^= Nothing)
220+ . (localConnections ^: removeConnectionsFrom (ProcessIdentifier pid))
217 writeChan (localCtrlChan node) NCMsg
221 writeChan (localCtrlChan node) NCMsg
218 { ctrlMsgSender = ProcessIdentifier pid
222 { ctrlMsgSender = ProcessIdentifier pid
219 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
223 , ctrlMsgSignal = Died (ProcessIdentifier pid) reason
@@ -236,6 +240,13 @@ forkProcess node proc = modifyMVar (localState node) $ \st -> do
243+-- | Remove connections from 'ident' (typically because 'ident' has terminated)
244+removeConnectionsFrom :: Identifier
245+ -> Map (Identifier, Identifier) NT.Connection
246+ -> Map (Identifier, Identifier) NT.Connection
247+removeConnectionsFrom ident =
248+ Map.filterWithKey $ \(fr, _to) _conn -> fr /= ident
239handleIncomingMessages :: LocalNode -> IO ()
250handleIncomingMessages :: LocalNode -> IO ()
240handleIncomingMessages node = go [] Map.empty Map.empty Set.empty
251handleIncomingMessages node = go [] Map.empty Map.empty Set.empty
@@ -424,6 +435,8 @@ nodeController = do
424 ncEffectWhereIs from label
435 ncEffectWhereIs from label
425 NCMsg from (NamedSend label msg') ->
436 NCMsg from (NamedSend label msg') ->
426 ncEffectNamedSend from label msg'
437 ncEffectNamedSend from label msg'
438+ NCMsg from (Reconnect to) ->
439+ ncEffectReconnect from to
427 unexpected ->
440 unexpected ->
428 error $ "nodeController: unexpected message " ++ show unexpected
441 error $ "nodeController: unexpected message " ++ show unexpected
@@ -547,6 +560,12 @@ ncEffectNamedSend from label msg = do
547 (ProcessIdentifier pid)
560 (ProcessIdentifier pid)
548 (messageToPayload msg)
561 (messageToPayload msg)
564+ncEffectReconnect :: Identifier -> Identifier -> NC ()
565+ncEffectReconnect from to = do
567+ liftIO $ reconnect node from to
550--------------------------------------------------------------------------------
569--------------------------------------------------------------------------------
551-- Auxiliary --
570-- Auxiliary --
552--------------------------------------------------------------------------------
571--------------------------------------------------------------------------------
@@ -592,6 +611,7 @@ destNid (Spawn _ _) = Nothing
592destNid (Register _ _) = Nothing
611destNid (Register _ _) = Nothing
593destNid (WhereIs _) = Nothing
612destNid (WhereIs _) = Nothing
594destNid (NamedSend _ _) = Nothing
613destNid (NamedSend _ _) = Nothing
614+destNid (Reconnect _) = Nothing
595-- We don't need to forward 'Died' signals; if monitoring/linking is setup,
615-- We don't need to forward 'Died' signals; if monitoring/linking is setup,
596-- then when a local process dies the monitoring/linking machinery will take
616-- then when a local process dies the monitoring/linking machinery will take
597-- care of notifying remote nodes
617-- care of notifying remote nodes