@@ -41,7 +41,6 @@ where
4141import Control.Concurrent (myThreadId)
4242import Control.Monad.Base (MonadBase(..), liftBaseDefault)
4343import Control.Monad.Catch (MonadThrow, throwM)
44−import Control.Monad.Trans.Control (MonadBaseControl (..))
4544import Control.Concurrent.MVar (newEmptyMVar)
4645-- import Control.Monad.Error.Class (MonadError(..))
4746import Control.Monad.IO.Class (MonadIO(..))
@@ -59,7 +58,7 @@ import Prelude hiding (map)
5958import qualified Data.Set as S
6059
6160import Streamly.Internal.Control.Concurrent
62− (MonadAsync, RunInIO(..), captureMonadState)
61+ (MonadRunInIO, MonadAsync, RunInIO(..), askRunInIO, restoreM)
6362import Streamly.Internal.Data.Atomics
6463 (atomicModifyIORefCAS, atomicModifyIORefCAS_)
6564import Streamly.Internal.Data.Stream.Serial (SerialT (..))
@@ -104,7 +103,7 @@ data WorkerStatus = Continue | Suspend
104103
105104{-# INLINE workLoopLIFO #-}
106105workLoopLIFO
107− :: (MonadIO m, MonadBaseControl IO m)
106+ :: MonadRunInIO m
108107 => IORef [(RunInIO m, Stream m a)]
109108 -> State Stream m a
110109 -> SVar Stream m a
@@ -143,7 +142,7 @@ workLoopLIFO q st sv winfo = run
143142 if res
144143 then K.foldStreamShared st yieldk single (return Continue) r
145144 else do
146− runInIO <- captureMonadState
145+ runInIO <- askRunInIO
147146 liftIO $ enqueueLIFO sv q (runInIO, r)
148147 return Suspend
149148
@@ -158,7 +157,7 @@ workLoopLIFO q st sv winfo = run
158157-- make a check every time.
159158{-# INLINE workLoopLIFOLimited #-}
160159workLoopLIFOLimited
161− :: forall m a. (MonadIO m, MonadBaseControl IO m)
160+ :: forall m a. MonadRunInIO m
162161 => IORef [(RunInIO m, Stream m a)]
163162 -> State Stream m a
164163 -> SVar Stream m a
@@ -209,7 +208,7 @@ workLoopLIFOLimited q st sv winfo = run
209208 if res && yieldLimitOk
210209 then K.foldStreamShared st yieldk single incrContinue r
211210 else do
212− runInIO <- captureMonadState
211+ runInIO <- askRunInIO
213212 liftIO $ incrementYieldLimit sv
214213 liftIO $ enqueueLIFO sv q (runInIO, r)
215214 return Suspend
@@ -240,7 +239,7 @@ enqueueFIFO sv q m = do
240239
241240{-# INLINE workLoopFIFO #-}
242241workLoopFIFO
243− :: (MonadIO m, MonadBaseControl IO m)
242+ :: MonadRunInIO m
244243 => LinkedQueue (RunInIO m, Stream m a)
245244 -> State Stream m a
246245 -> SVar Stream m a
@@ -273,13 +272,13 @@ workLoopFIFO q st sv winfo = run
273272 -- yielding.
274273 yieldk a r = do
275274 res <- liftIO $ sendYield sv winfo (ChildYield a)
276− runInIO <- captureMonadState
275+ runInIO <- askRunInIO
277276 liftIO $ enqueueFIFO sv q (runInIO, r)
278277 return $ if res then Continue else Suspend
279278
280279{-# INLINE workLoopFIFOLimited #-}
281280workLoopFIFOLimited
282− :: forall m a. (MonadIO m, MonadBaseControl IO m)
281+ :: forall m a. MonadRunInIO m
283282 => LinkedQueue (RunInIO m, Stream m a)
284283 -> State Stream m a
285284 -> SVar Stream m a
@@ -316,7 +315,7 @@ workLoopFIFOLimited q st sv winfo = run
316315
317316 yieldk a r = do
318317 res <- liftIO $ sendYield sv winfo (ChildYield a)
319− runInIO <- captureMonadState
318+ runInIO <- askRunInIO
320319 liftIO $ enqueueFIFO sv q (runInIO, r)
321320 yieldLimitOk <- liftIO $ decrementYieldLimit sv
322321 if res && yieldLimitOk
@@ -533,7 +532,7 @@ getFifoSVar st mrun = do
533532newAsyncVar :: MonadAsync m
534533 => State Stream m a -> Stream m a -> m (SVar Stream m a)
535534newAsyncVar st m = do
536− mrun <- captureMonadState
535+ mrun <- askRunInIO
537536 sv <- liftIO $ getLifoSVar st mrun
538537 sendFirstWorker sv m
539538
@@ -573,7 +572,7 @@ mkAsyncD m = D.Stream step Nothing
573572newWAsyncVar :: MonadAsync m
574573 => State Stream m a -> Stream m a -> m (SVar Stream m a)
575574newWAsyncVar st m = do
576− mrun <- captureMonadState
575+ mrun <- askRunInIO
577576 sv <- liftIO $ getFifoSVar st mrun
578577 -- XXX Use just Stream and IO in all the functions below
579578 -- 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
653652 K.foldStream st yld sng stp $ getSerialT $ fromSVar sv
654653 where
655654 concurrently ma mb = K.mkStream $ \st yld sng stp -> do
656− runInIO <- captureMonadState
655+ runInIO <- askRunInIO
657656 liftIO $ enqueue (fromJust $ streamVar st) (runInIO, mb)
658657 K.foldStreamShared st yld sng stp ma
659658
@@ -663,7 +662,7 @@ joinStreamVarAsync :: MonadAsync m
663662joinStreamVarAsync style m1 m2 = K.mkStream $ \st yld sng stp ->
664663 case streamVar st of
665664 Just sv | svarStyle sv == style -> do
666− runInIO <- captureMonadState
665+ runInIO <- askRunInIO
667666 liftIO $ enqueue sv (runInIO, m2)
668667 K.foldStreamShared st yld sng stp m1
669668 _ -> K.foldStreamShared st yld sng stp (forkSVarAsync style m1 m2)