@@ -134,11 +134,11 @@ nullTracer =
134134systemLoggerTracer :: Process ()
135135systemLoggerTracer = do
136136 node <- processNode <$> ask
137− let tr = sendTraceMsg node
137+ let tr = sendTraceLog node
138138 forever' $ receiveWait [ matchAny (\m -> handleMessage m tr) ]
139139 where
140− sendTraceMsg :: LocalNode -> MxEvent -> Process ()
141− sendTraceMsg node ev = do
140+ sendTraceLog :: LocalNode -> MxEvent -> Process ()
141+ sendTraceLog node ev = do
142142 now <- liftIO $ getCurrentTime
143143 msg <- return $ (formatTime defaultTimeLocale "%c" now, buildTxt ev)
144144 emptyPid <- return $ (nullProcessId (localNodeId node))
@@ -202,6 +202,7 @@ traceController mv = do
202202 where
203203 traceLoop :: TracerState -> Process ()
204204 traceLoop st = do
205+ let client' = client st
205206 -- Trace events are forwarded to the enabled trace target.
206207 -- At some point in the future, we're going to start writing these custom
207208 -- events to the ghc eventlog, at which point this design might change.
@@ -214,11 +215,11 @@ traceController mv = do
214215 case set of
215216 (TraceEnable pid) -> do
216217 -- notify the previous tracer it has been replaced
217− sendTrace st (createUnencodedMessage (MxTraceTakeover pid))
218+ sendTraceMsg client' (createUnencodedMessage (MxTraceTakeover pid))
218219 sendOk setResp
219220 return st { client = (Just pid) }
220221 TraceDisable -> do
221− sendTrace st (createUnencodedMessage MxTraceDisable)
222+ sendTraceMsg client' (createUnencodedMessage MxTraceDisable)
222223 sendOk setResp
223224 return st { client = Nothing })
224225 , match (\(confResp, flags') ->
@@ -294,13 +295,13 @@ handleTrace st msg ev = do
294295 case ev of
295296 (MxNodeDied _ _) ->
296297 case (traceNodes (flags st)) of
297− True -> sendTrace st msg
298+ True -> sendTrace st ev msg
298299 False -> return ()
299− (MxUser _) -> sendTrace st msg
300− (MxLog _) -> sendTrace st msg
300+ (MxUser _) -> sendTrace st ev msg
301+ (MxLog _) -> sendTrace st ev msg
301302 _ ->
302303 case (traceConnections (flags st)) of
303− True -> sendTrace st msg
304+ True -> sendTrace st ev msg
304305 False -> return ()
305306 return st
306307
@@ -310,14 +311,14 @@ traceEv :: MxEvent
310311 -> TracerState
311312 -> Process ()
312313traceEv _ _ Nothing _ = return ()
313−traceEv _ msg (Just TraceAll) st = sendTrace st msg
314+traceEv ev msg (Just TraceAll) st = sendTrace st ev msg
314315traceEv ev msg (Just (TraceProcs pids)) st = do
315316 node <- processNode <$> ask
316317 let p = case resolveToPid ev of
317318 Nothing -> (nullProcessId (localNodeId node))
318319 Just pid -> pid
319320 case (Set.member p pids) of
320− True -> sendTrace st msg
321+ True -> sendTrace st ev msg
321322 False -> return ()
322323traceEv ev msg (Just (TraceNames names)) st = do
323324 -- if we have recorded regnames for p, then we forward the trace iif
@@ -330,13 +331,16 @@ traceEv ev msg (Just (TraceNames names)) st = do
330331 Nothing -> return ()
331332 Just ns -> if (Set.null (Set.intersection ns names))
332333 then return ()
333− else sendTrace st msg
334+ else sendTrace st ev msg
334335
335−sendTrace :: TracerState -> Message -> Process ()
336−sendTrace st msg =
337− let pid = (client st) in do
338− case pid of
339− Just p -> (flip forward) p msg
340− Nothing -> return ()
336+sendTrace :: TracerState -> MxEvent -> Message -> Process ()
337+sendTrace st ev msg = do
338+ let c = client st
339+ if c == (resolveToPid ev) -- we do not send the tracer events about itself...
340+ then return ()
341+ else sendTraceMsg c msg
341342
343+sendTraceMsg :: Maybe ProcessId -> Message -> Process ()
344+sendTraceMsg Nothing _ = return ()
345+sendTraceMsg (Just p) msg = (flip forward) p msg
342346