66{-# LANGUAGE GADTs #-}
77{-# LANGUAGE KindSignatures #-}
88{-# LANGUAGE LambdaCase #-}
9- {-# LANGUAGE MultiWayIf #-}
109{-# LANGUAGE NamedFieldPuns #-}
1110{-# LANGUAGE RankNTypes #-}
1211{-# LANGUAGE ScopedTypeVariables #-}
1312{-# LANGUAGE TypeOperators #-}
14- {-# LANGUAGE ViewPatterns #-}
1513
1614-- 'runResponder' is using a redundant constraint.
1715{-# OPTIONS_GHC -Wno-redundant-constraints #-}
@@ -46,7 +44,7 @@ import Control.Applicative (Alternative)
4644import Control.Concurrent.Class.MonadSTM qualified as LazySTM
4745import Control.Concurrent.Class.MonadSTM.Strict
4846import Control.Exception (SomeAsyncException (.. ))
49- import Control.Monad (foldM , forM_ , forever , when )
47+ import Control.Monad (foldM , forM_ , forever )
5048import Control.Monad.Class.MonadAsync
5149import Control.Monad.Class.MonadFork
5250import Control.Monad.Class.MonadThrow
@@ -221,25 +219,33 @@ with
221219 check . Map. member peer . connections =<< readTVar stateVar
222220 modifyTVar countersVar $ Map. insert peer (ResponderCounters 0 0 )
223221
224- (startWithID -> Just mid) -> atomically do
222+ _ | Just mid <- startWithID trace -> atomically do
225223 connections <- connections <$> readTVar stateVar
226224 case Map. lookup peer connections of
227225 Nothing -> modifyTVar countersVar $ Map. delete peer
228226 Just connState -> do
229227 ResponderCounters {numTraceHotResponders,
230228 numTraceWarmResponders}
231229 <- (Map. ! peer) <$> readTVar countersVar
232- case getProtocolTemp mid connState of
233- Hot -> do
234- when (numTraceHotResponders == 0 ) $
235- InfoChannel. writeMessage infoChannel $ RemotePromotedToHot peer
236- adjustHotResponders succ peer
237- _rest -> do
238- when (numTraceWarmResponders + numTraceHotResponders == 0 ) $
239- InfoChannel. writeMessage infoChannel $ AwakeRemote peer
240- adjustWarmResponders succ peer
241-
242- (terminateWithID -> Just mid) -> atomically do
230+ let miniProtocolTemp = getProtocolTemp mid connState
231+ case ( miniProtocolTemp
232+ , numTraceWarmResponders
233+ , numTraceHotResponders) of
234+ (Hot , 0 , 0 ) -> do
235+ InfoChannel. writeMessage infoChannel $ AwakeRemote peer
236+ InfoChannel. writeMessage infoChannel $ RemotePromotedToHot peer
237+ (Hot , _, 0 ) ->
238+ InfoChannel. writeMessage infoChannel $ RemotePromotedToHot peer
239+ (Hot , _, _) -> pure ()
240+ (_notHot, 0 , 0 ) -> do
241+ InfoChannel. writeMessage infoChannel $ AwakeRemote peer
242+ _otherwise -> pure ()
243+
244+ case miniProtocolTemp of
245+ Hot -> adjustHotResponders succ peer
246+ _warm -> adjustWarmResponders succ peer
247+
248+ _ | Just mid <- terminateWithID trace -> atomically do
243249 connections <- connections <$> readTVar stateVar
244250 case Map. lookup peer connections of
245251 Nothing -> modifyTVar countersVar $ Map. delete peer
@@ -253,16 +259,25 @@ with
253259 let miniProtocolTemp = getProtocolTemp mid connState
254260 case trace of
255261 Mux. TraceCleanExit {} -> do
262+ case ( getProtocolTemp mid connState
263+ , numTraceWarmResponders
264+ , numTraceHotResponders) of
265+ (Hot , 0 , 1 ) -> do
266+ InfoChannel. writeMessage infoChannel $ RemoteDemotedToWarm peer
267+ InfoChannel. writeMessage infoChannel $ WaitIdleRemote peer
268+ (Hot , _, 1 ) ->
269+ InfoChannel. writeMessage infoChannel $ RemoteDemotedToWarm peer
270+ (Hot , _, _) -> pure ()
271+ (_notHot, 1 , 0 ) ->
272+ InfoChannel. writeMessage infoChannel $ WaitIdleRemote peer
273+ _otherwise -> pure ()
274+
256275 case miniProtocolTemp of
257276 Hot -> adjustHotResponders pred peer
258277 _rest -> adjustWarmResponders pred peer
259- if | numTraceHotResponders + numTraceWarmResponders == 1 ->
260- InfoChannel. writeMessage infoChannel $ WaitIdleRemote peer
261- | numTraceHotResponders == 1
262- , Hot <- miniProtocolTemp ->
263- InfoChannel. writeMessage infoChannel $ RemoteDemotedToWarm peer
264- | otherwise -> return ()
265- _otherwise -> return ()
278+
279+ _otherwise -> return () -- muxStopped _should_ be on the queue
280+
266281 InfoChannel. writeMessage infoChannel $
267282 MiniProtocolTerminated $ Terminated {
268283 tConnId = peer,
271286 tDataFlow = connectionDataFlow csVersionData,
272287 tResult = csCompletionMap Map. ! mid }
273288
274- (muxStopped -> True ) -> atomically do
289+ _ | True <- muxStopped trace -> atomically do
275290 State { connections } <- readTVar stateVar
276291 case Map. lookup peer connections of
277292 Just ConnectionState {csMux} ->
0 commit comments