@@ -21,6 +21,7 @@ where
22import Control.Concurrent (myThreadId)
22import Control.Concurrent (myThreadId)
23import Control.Concurrent.MVar (newEmptyMVar)
23import Control.Concurrent.MVar (newEmptyMVar)
24+import Control.Monad (when, void)
24import Control.Monad.IO.Class (MonadIO(liftIO))
25import Control.Monad.IO.Class (MonadIO(liftIO))
25import Control.Monad.Trans.Control (MonadBaseControl, restoreM)
26import Control.Monad.Trans.Control (MonadBaseControl, restoreM)
26import Data.IORef (IORef, newIORef, readIORef)
27import Data.IORef (IORef, newIORef, readIORef)
@@ -28,12 +29,13 @@ import Streamly.Internal.Control.Concurrent
28 (MonadRunInIO, MonadAsync, RunInIO(..), askRunInIO)
29 (MonadRunInIO, MonadAsync, RunInIO(..), askRunInIO)
29import Streamly.Internal.Data.Atomics
30import Streamly.Internal.Data.Atomics
30 (atomicModifyIORefCAS, atomicModifyIORefCAS_)
31 (atomicModifyIORefCAS, atomicModifyIORefCAS_)
31−import Streamly.Internal.Data.Stream.Channel.Dispatcher (delThread)
32+import Streamly.Internal.Data.Stream.Channel.Dispatcher (modifyThread)
33import qualified Data.Set as Set
34import qualified Data.Set as Set
34import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
35import qualified Streamly.Internal.Data.Stream.StreamK.Type as K
36import Streamly.Internal.Data.Stream.Async.Channel.Consumer
37import Streamly.Internal.Data.Stream.Async.Channel.Consumer
38+import Streamly.Internal.Data.Stream.Async.Channel.Dispatcher
37import Streamly.Internal.Data.Stream.Async.Channel.Type
39import Streamly.Internal.Data.Stream.Async.Channel.Type
38import Streamly.Internal.Data.Stream.Channel.Types
40import Streamly.Internal.Data.Stream.Channel.Types
@@ -251,6 +253,8 @@ getLifoSVar mrun cfg = do
251 qEmpty <- isWorkFinished sv
253 qEmpty <- isWorkFinished sv
252 return $ qEmpty || yieldsDone
254 return $ qEmpty || yieldsDone
256+ let eager = getEagerDispatch cfg
254 let getSVar :: Channel m a
258 let getSVar :: Channel m a
255 -> (Channel m a -> m [ChildEvent a])
259 -> (Channel m a -> m [ChildEvent a])
256 -> (Channel m a -> m Bool)
260 -> (Channel m a -> m Bool)
@@ -272,12 +276,14 @@ getLifoSVar mrun cfg = do
272 , workerThreads = running
276 , workerThreads = running
273 , workLoop = wloop q sv
277 , workLoop = wloop q sv
274 , enqueue = enqueueLIFO sv q
278 , enqueue = enqueueLIFO sv q
279+ , eagerDispatch = when eager $ void $ dispatchWorker 0 sv
275 , isWorkDone = workDone sv
280 , isWorkDone = workDone sv
276 , isQueueDone = workDone sv
281 , isQueueDone = workDone sv
277 , needDoorBell = wfw
282 , needDoorBell = wfw
278 , svarMrun = mrun
283 , svarMrun = mrun
279 , workerCount = active
284 , workerCount = active
285+ -- XXX We can use delThread or modThread based on eager flag.
280− , accountThread = delThread running
286+ , accountThread = modifyThread running outQMv
281 , workerStopMVar = undefined
287 , workerStopMVar = undefined
282 , svarRef = Nothing
288 , svarRef = Nothing
283 , svarInspectMode = getInspectMode cfg
289 , svarInspectMode = getInspectMode cfg