@@ -86,7 +86,7 @@ import qualified Data.ByteString.Lazy as BSL ( ByteString
87import Data.Binary (Binary, decode, encode, put, get, putWord8, getWord8)
87import Data.Binary (Binary, decode, encode, put, get, putWord8, getWord8)
88import Data.Map (Map)
88import Data.Map (Map)
89−import qualified Data.Map as Map (empty, lookup, insert, delete, keys, toList)
89+import qualified Data.Map as Map (empty, lookup, insert, delete, toList)
90import qualified Data.List as List (delete)
90import qualified Data.List as List (delete)
91import Data.Set (Set)
91import Data.Set (Set)
92import qualified Data.Set as Set (empty, insert, delete, member)
92import qualified Data.Set as Set (empty, insert, delete, member)
@@ -186,7 +186,6 @@ data LocalNodeState = LocalNodeState
186 { _localProcesses :: Map LocalProcessId LocalProcess
186 { _localProcesses :: Map LocalProcessId LocalProcess
187 , _localPidCounter :: Int32
187 , _localPidCounter :: Int32
188 , _localPidUnique :: Int32
188 , _localPidUnique :: Int32
189− , _monitorActions :: Map ProcessId [IO ()]
190 , _localMonitorCounter :: Int32
189 , _localMonitorCounter :: Int32
@@ -232,6 +231,7 @@ send them msg = do
232getSelfPid :: Process ProcessId
231getSelfPid :: Process ProcessId
233getSelfPid = processId <$> ask
232getSelfPid = processId <$> ask
234+-- | Monitor another process
235monitor :: ProcessId -> Process MonitorRef
235monitor :: ProcessId -> Process MonitorRef
236monitor them = do
236monitor them = do
237 us <- getSelfPid
237 us <- getSelfPid
@@ -269,7 +269,6 @@ expectTimeout timeout = do
269 dequeueMatching queue (Just timeout) ((== fp) . messageFingerprint)
269 dequeueMatching queue (Just timeout) ((== fp) . messageFingerprint)
270 return $ fmap (decode . messageEncoding) msg
270 return $ fmap (decode . messageEncoding) msg
273--------------------------------------------------------------------------------
272--------------------------------------------------------------------------------
274-- The node controller --
273-- The node controller --
275--------------------------------------------------------------------------------
274--------------------------------------------------------------------------------
@@ -488,7 +487,6 @@ newLocalNode transport = do
488 { _localProcesses = Map.empty
487 { _localProcesses = Map.empty
489 , _localPidCounter = 0
488 , _localPidCounter = 0
490 , _localPidUnique = unq
489 , _localPidUnique = unq
491− , _monitorActions = Map.empty
492 , _localMonitorCounter = 0
490 , _localMonitorCounter = 0
494 ctrlChan <- newChan
492 ctrlChan <- newChan
@@ -587,12 +585,12 @@ handleIncomingMessages node = go [] Map.empty Set.empty
587 (Map.delete cid procConns)
585 (Map.delete cid procConns)
588 (Set.delete cid ctrlConns)
586 (Set.delete cid ctrlConns)
589 NT.ErrorEvent (NT.TransportError (NT.EventConnectionLost (Just theirAddr) _) _) -> do
587 NT.ErrorEvent (NT.TransportError (NT.EventConnectionLost (Just theirAddr) _) _) -> do
590− -- TODO: we could cache this information
588+ -- [Unified table 9, rule node_disconnect]
591− pids <- withMVar state $ \st ->
589+ let nid = Right $ NodeId theirAddr
592− return $ filter ((== theirAddr) . nodeAddress . processNodeId)
590+ writeChan ctrlChan NCMsg
593− . Map.keys
591+ { ctrlMsgSender = nid
594− $ st ^. monitorActions
592+ , ctrlMsgSignal = Died nid DiedDisconnect
595− forM_ pids $ remoteProcessFailed node
593+ }
596 NT.ErrorEvent _ ->
594 NT.ErrorEvent _ ->
597 fail "handleIncomingMessages: TODO 4"
595 fail "handleIncomingMessages: TODO 4"
598 NT.EndPointClosed ->
596 NT.EndPointClosed ->
@@ -774,18 +772,12 @@ localPidCounter = accessor _localPidCounter (\ctr st -> st { _localPidCounter =
774localPidUnique :: Accessor LocalNodeState Int32
772localPidUnique :: Accessor LocalNodeState Int32
775localPidUnique = accessor _localPidUnique (\unq st -> st { _localPidUnique = unq })
773localPidUnique = accessor _localPidUnique (\unq st -> st { _localPidUnique = unq })
777−monitorActions :: Accessor LocalNodeState (Map ProcessId [IO ()])
778−monitorActions = accessor _monitorActions (\as st -> st { _monitorActions = as })
780localMonitorCounter :: Accessor LocalNodeState Int32
775localMonitorCounter :: Accessor LocalNodeState Int32
781localMonitorCounter = accessor _localMonitorCounter (\ctr st -> st { _localMonitorCounter = ctr })
776localMonitorCounter = accessor _localMonitorCounter (\ctr st -> st { _localMonitorCounter = ctr })
783localProcessWithId :: LocalProcessId -> Accessor LocalNodeState (Maybe LocalProcess)
778localProcessWithId :: LocalProcessId -> Accessor LocalNodeState (Maybe LocalProcess)
784localProcessWithId lpid = localProcesses >>> DAC.mapMaybe lpid
779localProcessWithId lpid = localProcesses >>> DAC.mapMaybe lpid
786−monitorActionsFor :: ProcessId -> Accessor LocalNodeState [IO ()]
787−monitorActionsFor pid = monitorActions >>> DAC.mapDefault [] pid
789connections :: Accessor LocalProcessState (Map ProcessId NT.Connection)
781connections :: Accessor LocalProcessState (Map ProcessId NT.Connection)
790connections = accessor _connections (\conns st -> st { _connections = conns })
782connections = accessor _connections (\conns st -> st { _connections = conns })