@@ -5,15 +5,16 @@ module Cardano.Logging.Tracer.Standard (
5
5
standardTracer
6
6
) where
7
7
8
+ import Control.Concurrent (myThreadId )
8
9
import Control.Concurrent.Async
9
10
import Control.Concurrent.Chan.Unagi.Bounded
10
- import Control.Exception (BlockedIndefinitelyOnMVar , catch )
11
11
import Control.Monad (forever , when )
12
12
import Control.Monad.IO.Class
13
13
import Data.IORef (IORef , modifyIORef' , newIORef , readIORef )
14
14
import Data.Maybe (isNothing )
15
15
import Data.Text (Text )
16
16
import qualified Data.Text.IO as TIO
17
+ import GHC.Conc (labelThread )
17
18
import System.IO (hFlush , stdout )
18
19
19
20
import Cardano.Logging.DocuGenerator
@@ -29,6 +30,8 @@ newtype StandardTracerState = StandardTracerState {
29
30
emptyStandardTracerState :: StandardTracerState
30
31
emptyStandardTracerState = StandardTracerState Nothing
31
32
33
+ -- | It is mandatory to construct only one standard tracer in any application!
34
+ -- Throwing away a standard tracer and using a new one will result in an exception
32
35
standardTracer :: forall m . (MonadIO m )
33
36
=> m (Trace m FormattedMessage )
34
37
standardTracer = do
@@ -66,9 +69,10 @@ standardTracer = do
66
69
startStdoutThread :: IORef StandardTracerState -> IO ()
67
70
startStdoutThread stateRef = do
68
71
(inChan, outChan) <- newChan 2048
69
- as <- async (catch
70
- (stdoutThread outChan)
71
- (\ (_ :: BlockedIndefinitelyOnMVar ) -> pure () ))
72
+ as <- async (do
73
+ tid <- myThreadId
74
+ labelThread tid " StdoutTrace"
75
+ stdoutThread outChan)
72
76
link as
73
77
modifyIORef' stateRef (\ st ->
74
78
st {stRunning = Just (inChan, outChan, as)})
0 commit comments