@@ -45,6 +45,8 @@ import Control.Distributed.Process.Internal.Trace.Types
45 , TraceOk(..)
45 , TraceOk(..)
46 , defaultTraceFlags
46 , defaultTraceFlags
48+import Control.Distributed.Process.Internal.Trace.Primitives
48import Control.Distributed.Process.Internal.Types
50import Control.Distributed.Process.Internal.Types
49 ( LocalNode(..)
51 ( LocalNode(..)
50 , NCMsg(..)
52 , NCMsg(..)
@@ -150,7 +152,7 @@ systemLoggerTracer = do
150 liftIO $ writeChan (localCtrlChan node) traceMsg
152 liftIO $ writeChan (localCtrlChan node) traceMsg
152eventLogTracer :: Process ()
154eventLogTracer :: Process ()
153−eventLogTracer = do
155+eventLogTracer =
154 -- NB: when the GHC event log supports tracing arbitrary (ish) data, we will
156 -- NB: when the GHC event log supports tracing arbitrary (ish) data, we will
155 -- almost certainly use *that* facility independently of whether or not there
157 -- almost certainly use *that* facility independently of whether or not there
156 -- is a tracer process installed. This is just a stop gap until then.
158 -- is a tracer process installed. This is just a stop gap until then.
@@ -194,10 +196,8 @@ traceController mv = do
194 -- the node's internal control channel if we can possibly help it!
196 -- the node's internal control channel if we can possibly help it!
195 weakQueue <- processWeakQ <$> ask
197 weakQueue <- processWeakQ <$> ask
196 liftIO $ putMVar mv weakQueue
198 liftIO $ putMVar mv weakQueue
197− initialTracer <- whereis "tracer.initial"
199+ initState <- initialState
198− traceLoop initialState {
200+ traceLoop initState { client = Nothing }
199− client = initialTracer
202 traceLoop :: TracerState -> Process ()
202 traceLoop :: TracerState -> Process ()
203 traceLoop st = do
203 traceLoop st = do
@@ -234,13 +234,33 @@ traceController mv = do
234 sendOk Nothing = return ()
234 sendOk Nothing = return ()
235 sendOk (Just sp) = sendChan sp TraceOk
235 sendOk (Just sp) = sendChan sp TraceOk
237− initialState :: TracerState
237+ initialState :: Process TracerState
238− initialState =
238+ initialState = do
239− TracerST
239+ flags' <- checkEnvFlags
240− { client = Nothing
240+ return $ TracerST { client = Nothing
241− , flags = defaultTraceFlags
241+ , flags = flags'
242− , regNames = Map.empty
242+ , regNames = Map.empty
245+ checkEnvFlags :: Process TraceFlags
247+ catch (checkEnv "DISTRIBUTED_PROCESS_TRACE_FLAGS" >>= return . parseFlags)
248+ (\(_ :: IOError) -> return defaultTraceFlags)
250+ -- quick and dirty fold-while
251+ parseFlags :: String -> TraceFlags
252+ parseFlags flags = parseFlags' flags defaultTraceFlags
253+ where parseFlags' :: String -> TraceFlags -> TraceFlags
254+ parseFlags' [] parsedFlags = parsedFlags
255+ parseFlags' (x:xs) parsedFlags
256+ | x == 'p' = parseFlags' xs parsedFlags { traceSpawned = traceOn }
257+ | x == 'n' = parseFlags' xs parsedFlags { traceRegistered = traceOn }
258+ | x == 'u' = parseFlags' xs parsedFlags { traceUnregistered = traceOn }
259+ | x == 'd' = parseFlags' xs parsedFlags { traceDied = traceOn }
260+ | x == 's' = parseFlags' xs parsedFlags { traceSend = traceOn }
261+ | x == 'r' = parseFlags' xs parsedFlags { traceRecv = traceOn }
262+ | x == 'l' = parseFlags' xs parsedFlags { traceNodes = True }
263+ | otherwise = parseFlags' xs parsedFlags
245-- note [runtime tracer control]
265-- note [runtime tracer control]