@@ -41,7 +41,6 @@ where
41import Control.Concurrent (myThreadId)
41import Control.Concurrent (myThreadId)
42import Control.Monad.Base (MonadBase(..), liftBaseDefault)
42import Control.Monad.Base (MonadBase(..), liftBaseDefault)
43import Control.Monad.Catch (MonadThrow, throwM)
43import Control.Monad.Catch (MonadThrow, throwM)
44−import Control.Monad.Trans.Control (MonadBaseControl (..))
45import Control.Concurrent.MVar (newEmptyMVar)
44import Control.Concurrent.MVar (newEmptyMVar)
46-- import Control.Monad.Error.Class (MonadError(..))
45-- import Control.Monad.Error.Class (MonadError(..))
47import Control.Monad.IO.Class (MonadIO(..))
46import Control.Monad.IO.Class (MonadIO(..))
@@ -59,7 +58,7 @@ import Prelude hiding (map)
59import qualified Data.Set as S
58import qualified Data.Set as S
61import Streamly.Internal.Control.Concurrent
60import Streamly.Internal.Control.Concurrent
62− (MonadAsync, RunInIO(..), captureMonadState)
61+ (MonadRunInIO, MonadAsync, RunInIO(..), askRunInIO, restoreM)
63import Streamly.Internal.Data.Atomics
62import Streamly.Internal.Data.Atomics
64 (atomicModifyIORefCAS, atomicModifyIORefCAS_)
63 (atomicModifyIORefCAS, atomicModifyIORefCAS_)
65import Streamly.Internal.Data.Stream.Serial (SerialT (..))
64import Streamly.Internal.Data.Stream.Serial (SerialT (..))
@@ -104,7 +103,7 @@ data WorkerStatus = Continue | Suspend
105{-# INLINE workLoopLIFO #-}
104{-# INLINE workLoopLIFO #-}
106workLoopLIFO
105workLoopLIFO
107− :: (MonadIO m, MonadBaseControl IO m)
106+ :: MonadRunInIO m
108 => IORef [(RunInIO m, Stream m a)]
107 => IORef [(RunInIO m, Stream m a)]
109 -> State Stream m a
108 -> State Stream m a
110 -> SVar Stream m a
109 -> SVar Stream m a
@@ -143,7 +142,7 @@ workLoopLIFO q st sv winfo = run
144 then K.foldStreamShared st yieldk single (return Continue) r
143 then K.foldStreamShared st yieldk single (return Continue) r
146− runInIO <- captureMonadState
145+ runInIO <- askRunInIO
147 liftIO $ enqueueLIFO sv q (runInIO, r)
146 liftIO $ enqueueLIFO sv q (runInIO, r)
148 return Suspend
147 return Suspend
@@ -158,7 +157,7 @@ workLoopLIFO q st sv winfo = run
158-- make a check every time.
157-- make a check every time.
159{-# INLINE workLoopLIFOLimited #-}
158{-# INLINE workLoopLIFOLimited #-}
160workLoopLIFOLimited
159workLoopLIFOLimited
161− :: forall m a. (MonadIO m, MonadBaseControl IO m)
160+ :: forall m a. MonadRunInIO m
162 => IORef [(RunInIO m, Stream m a)]
161 => IORef [(RunInIO m, Stream m a)]
163 -> State Stream m a
162 -> State Stream m a
164 -> SVar Stream m a
163 -> SVar Stream m a
@@ -209,7 +208,7 @@ workLoopLIFOLimited q st sv winfo = run
209 if res && yieldLimitOk
208 if res && yieldLimitOk
210 then K.foldStreamShared st yieldk single incrContinue r
209 then K.foldStreamShared st yieldk single incrContinue r
212− runInIO <- captureMonadState
211+ runInIO <- askRunInIO
213 liftIO $ incrementYieldLimit sv
212 liftIO $ incrementYieldLimit sv
214 liftIO $ enqueueLIFO sv q (runInIO, r)
213 liftIO $ enqueueLIFO sv q (runInIO, r)
215 return Suspend
214 return Suspend
@@ -240,7 +239,7 @@ enqueueFIFO sv q m = do
241{-# INLINE workLoopFIFO #-}
240{-# INLINE workLoopFIFO #-}
242workLoopFIFO
241workLoopFIFO
243− :: (MonadIO m, MonadBaseControl IO m)
242+ :: MonadRunInIO m
244 => LinkedQueue (RunInIO m, Stream m a)
243 => LinkedQueue (RunInIO m, Stream m a)
245 -> State Stream m a
244 -> State Stream m a
246 -> SVar Stream m a
245 -> SVar Stream m a
@@ -273,13 +272,13 @@ workLoopFIFO q st sv winfo = run
273 -- yielding.
272 -- yielding.
274 yieldk a r = do
273 yieldk a r = do
275 res <- liftIO $ sendYield sv winfo (ChildYield a)
274 res <- liftIO $ sendYield sv winfo (ChildYield a)
276− runInIO <- captureMonadState
275+ runInIO <- askRunInIO
277 liftIO $ enqueueFIFO sv q (runInIO, r)
276 liftIO $ enqueueFIFO sv q (runInIO, r)
278 return $ if res then Continue else Suspend
277 return $ if res then Continue else Suspend
280{-# INLINE workLoopFIFOLimited #-}
279{-# INLINE workLoopFIFOLimited #-}
281workLoopFIFOLimited
280workLoopFIFOLimited
282− :: forall m a. (MonadIO m, MonadBaseControl IO m)
281+ :: forall m a. MonadRunInIO m
283 => LinkedQueue (RunInIO m, Stream m a)
282 => LinkedQueue (RunInIO m, Stream m a)
284 -> State Stream m a
283 -> State Stream m a
285 -> SVar Stream m a
284 -> SVar Stream m a
@@ -316,7 +315,7 @@ workLoopFIFOLimited q st sv winfo = run
317 yieldk a r = do
316 yieldk a r = do
318 res <- liftIO $ sendYield sv winfo (ChildYield a)
317 res <- liftIO $ sendYield sv winfo (ChildYield a)
319− runInIO <- captureMonadState
318+ runInIO <- askRunInIO
320 liftIO $ enqueueFIFO sv q (runInIO, r)
319 liftIO $ enqueueFIFO sv q (runInIO, r)
321 yieldLimitOk <- liftIO $ decrementYieldLimit sv
320 yieldLimitOk <- liftIO $ decrementYieldLimit sv
322 if res && yieldLimitOk
321 if res && yieldLimitOk
@@ -533,7 +532,7 @@ getFifoSVar st mrun = do
533newAsyncVar :: MonadAsync m
532newAsyncVar :: MonadAsync m
534 => State Stream m a -> Stream m a -> m (SVar Stream m a)
533 => State Stream m a -> Stream m a -> m (SVar Stream m a)
535newAsyncVar st m = do
534newAsyncVar st m = do
536− mrun <- captureMonadState
535+ mrun <- askRunInIO
537 sv <- liftIO $ getLifoSVar st mrun
536 sv <- liftIO $ getLifoSVar st mrun
538 sendFirstWorker sv m
537 sendFirstWorker sv m
@@ -573,7 +572,7 @@ mkAsyncD m = D.Stream step Nothing
573newWAsyncVar :: MonadAsync m
572newWAsyncVar :: MonadAsync m
574 => State Stream m a -> Stream m a -> m (SVar Stream m a)
573 => State Stream m a -> Stream m a -> m (SVar Stream m a)
575newWAsyncVar st m = do
574newWAsyncVar st m = do
576− mrun <- captureMonadState
575+ mrun <- askRunInIO
577 sv <- liftIO $ getFifoSVar st mrun
576 sv <- liftIO $ getFifoSVar st mrun
578 -- XXX Use just Stream and IO in all the functions below
577 -- XXX Use just Stream and IO in all the functions below
579 -- XXX pass mrun instead of calling captureMonadState again inside it
578 -- XXX pass mrun instead of calling captureMonadState again inside it
@@ -653,7 +652,7 @@ forkSVarAsync style m1 m2 = K.mkStream $ \st yld sng stp -> do
653 K.foldStream st yld sng stp $ getSerialT $ fromSVar sv
652 K.foldStream st yld sng stp $ getSerialT $ fromSVar sv
655 concurrently ma mb = K.mkStream $ \st yld sng stp -> do
654 concurrently ma mb = K.mkStream $ \st yld sng stp -> do
656− runInIO <- captureMonadState
655+ runInIO <- askRunInIO
657 liftIO $ enqueue (fromJust $ streamVar st) (runInIO, mb)
656 liftIO $ enqueue (fromJust $ streamVar st) (runInIO, mb)
658 K.foldStreamShared st yld sng stp ma
657 K.foldStreamShared st yld sng stp ma
@@ -663,7 +662,7 @@ joinStreamVarAsync :: MonadAsync m
663joinStreamVarAsync style m1 m2 = K.mkStream $ \st yld sng stp ->
662joinStreamVarAsync style m1 m2 = K.mkStream $ \st yld sng stp ->
664 case streamVar st of
663 case streamVar st of
665 Just sv | svarStyle sv == style -> do
664 Just sv | svarStyle sv == style -> do
666− runInIO <- captureMonadState
665+ runInIO <- askRunInIO
667 liftIO $ enqueue sv (runInIO, m2)
666 liftIO $ enqueue sv (runInIO, m2)
668 K.foldStreamShared st yld sng stp m1
667 K.foldStreamShared st yld sng stp m1
669 _ -> K.foldStreamShared st yld sng stp (forkSVarAsync style m1 m2)
668 _ -> K.foldStreamShared st yld sng stp (forkSVarAsync style m1 m2)