@@ -97,15 +97,20 @@ ui vm dict initialCorpus cliSelectedContract = do
9797
9898 corpusSaverStopVar <- spawnListener (saveCorpusEvent env)
9999
100- workers <- forM (zip corpusChunks [0 .. (nworkers- 1 )]) $
101- uncurry (spawnWorker env perWorkerTestLimit)
100+ let spawnWorkers =
101+ forM (zip corpusChunks [0 .. (nworkers- 1 )]) $
102+ uncurry (spawnWorker env perWorkerTestLimit)
102103
103104 case effectiveMode of
104105 Interactive -> do
105106 -- Channel to push events to update UI
106107 uiChannel <- liftIO $ newBChan 1000
107108 let forwardEvent = void . writeBChanNonBlocking uiChannel . EventReceived
109+
110+ -- Attach the log/event forwarder before workers start so early worker
111+ -- events (like startup logs) are not lost by dupChan.
108112 uiEventsForwarderStopVar <- spawnListener forwardEvent
113+ workers <- spawnWorkers
109114
110115 ticker <- liftIO . forkIO . forever $ do
111116 threadDelay 200_000 -- 200 ms
@@ -174,16 +179,19 @@ ui vm dict initialCorpus cliSelectedContract = do
174179 NonInteractive outputFormat -> do
175180 serverStopVar <- newEmptyMVar
176181
182+ let forwardEvent ev = putStrLn =<< runReaderT (ppLogLine vm ev) env
183+ -- Attach the log/event forwarder before workers start so early worker
184+ -- events (like startup logs) are not lost by dupChan.
185+ uiEventsForwarderStopVar <- spawnListener forwardEvent
186+ workers <- spawnWorkers
187+
177188 -- Handles ctrl-c
178189 liftIO $ forM_ [sigINT, sigTERM] $ \ sig ->
179190 let handler _ = do
180191 stopWorkers workers
181192 void $ tryPutMVar serverStopVar ()
182193 in installHandler sig handler
183194
184- let forwardEvent ev = putStrLn =<< runReaderT (ppLogLine vm ev) env
185- uiEventsForwarderStopVar <- spawnListener forwardEvent
186-
187195 -- Track last update time and gas for delta calculation
188196 startTime <- liftIO getTimestamp
189197 lastUpdateRef <- liftIO $ newIORef $ GasTracker startTime 0
0 commit comments