@@ -21,6 +21,7 @@ where
2121
2222import Control.Concurrent (myThreadId)
2323import Control.Concurrent.MVar (newEmptyMVar)
24+import Control.Monad (when, void)
2425import Control.Monad.IO.Class (MonadIO(liftIO))
2526import Control.Monad.Trans.Control (MonadBaseControl, restoreM)
2627import Data.IORef (IORef, newIORef, readIORef)
@@ -28,12 +29,13 @@ import Streamly.Internal.Control.Concurrent
2829 (MonadRunInIO, MonadAsync, RunInIO(..), askRunInIO)
2930import Streamly.Internal.Data.Atomics
3031 (atomicModifyIORefCAS, atomicModifyIORefCAS_)
31−import Streamly.Internal.Data.Stream.Channel.Dispatcher (delThread)
32+import Streamly.Internal.Data.Stream.Channel.Dispatcher (modifyThread)
3233
3334import qualified Data.Set as Set
3435import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
3536
3637import Streamly.Internal.Data.Stream.Async.Channel.Consumer
38+import Streamly.Internal.Data.Stream.Async.Channel.Dispatcher
3739import Streamly.Internal.Data.Stream.Async.Channel.Type
3840import Streamly.Internal.Data.Stream.Channel.Types
3941
@@ -251,6 +253,8 @@ getLifoSVar mrun cfg = do
251253 qEmpty <- isWorkFinished sv
252254 return $ qEmpty || yieldsDone
253255
256+ let eager = getEagerDispatch cfg
257+
254258 let getSVar :: Channel m a
255259 -> (Channel m a -> m [ChildEvent a])
256260 -> (Channel m a -> m Bool)
@@ -272,12 +276,14 @@ getLifoSVar mrun cfg = do
272276 , workerThreads = running
273277 , workLoop = wloop q sv
274278 , enqueue = enqueueLIFO sv q
279+ , eagerDispatch = when eager $ void $ dispatchWorker 0 sv
275280 , isWorkDone = workDone sv
276281 , isQueueDone = workDone sv
277282 , needDoorBell = wfw
278283 , svarMrun = mrun
279284 , workerCount = active
280− , accountThread = delThread running
285+ -- XXX We can use delThread or modThread based on eager flag.
286+ , accountThread = modifyThread running outQMv
281287 , workerStopMVar = undefined
282288 , svarRef = Nothing
283289 , svarInspectMode = getInspectMode cfg