@@ -186,15 +186,8 @@ import Control.Distributed.Process.Internal.Types
186import Control.Distributed.Process.Management.Internal.Agent
186import Control.Distributed.Process.Management.Internal.Agent
187 ( mxAgentController
187 ( mxAgentController
189−import Control.Distributed.Process.Management
189+import Control.Distributed.Process.Management.Internal.Types
196− , MxEvent(..)
190+ ( MxEvent(..)
199import qualified Control.Distributed.Process.Management.Internal.Trace.Remote as Trace
192import qualified Control.Distributed.Process.Management.Internal.Trace.Remote as Trace
200 ( remoteTable
193 ( remoteTable
@@ -323,44 +316,6 @@ startDefaultTracer node' = do
324-- TODO: we need a better mechanism for defining and registering services
317-- TODO: we need a better mechanism for defining and registering services
326−{- note [registry monitoring agent]
327− This agent listens for 'MxRegistered' and 'MxUnRegistered' events and tracks
328− all labels for remote 'ProcessId's that are stored in the registry.
330− When a remote process is registered, the agent starts monitoring it until it
331− is unregistered. We can safely ignore ProcessMonitorNotification's, since the
332− node controller is obligated to issue an MxUnRegistered event for any labels
333− connected to a dead process. Thus, our only responsibility here is to ensure
334− that we set up monitors for locally registered processes, and tear them down
335− once unregistration occurs.
338−registryMonitorAgent :: Process ProcessId
339−registryMonitorAgent = do
341− mxAgent registryMonitorAgentId (Map.empty :: Map String MonitorRef)
342− [ mxSink $ \ev -> do
344− MxRegistered pid label
345− | processNodeId pid /= nid -> do
346− mref <- liftMX $ monitor pid
347− mxUpdateLocal (Map.insert label mref)
348− MxUnRegistered pid label
349− | processNodeId pid /= nid -> do
351− forM_ (label `Map.lookup` mrefs) $ \mref -> do
352− liftMX $ unmonitorAsync mref
353− mxUpdateLocal (Map.delete label)
356− -- [note: no need to remove async answers from mailbox]
357− -- The framework simply discards any input you don't have a handler for.
358− -- See Management.hs `runAgent` for details.
361− registryMonitorAgentId :: MxAgentId
362− registryMonitorAgentId = MxAgentId "service.registry.monitoring"
364-- | Start and register the service processes on a node
319-- | Start and register the service processes on a node
365startServiceProcesses :: LocalNode -> IO ()
320startServiceProcesses :: LocalNode -> IO ()
366startServiceProcesses node = do
321startServiceProcesses node = do
@@ -376,7 +331,6 @@ startServiceProcesses node = do
376 -- loops during tracing if the user reregisters the "logger" with a custom
331 -- loops during tracing if the user reregisters the "logger" with a custom
377 -- process which uses 'send' or other primitives which are traced.
332 -- process which uses 'send' or other primitives which are traced.
378 register "trace.logger" logger
333 register "trace.logger" logger
379− void $ registryMonitorAgent
381 loop = do
335 loop = do
382 receiveWait
336 receiveWait