on master help sign in
Mask async exceptions in the "bracketIO" functions.
8f4f9edShlok Datye
src/Streamly/Internal/Data/Stream/StreamD.hs+6−4
@@ -320,14 +320,14 @@ where
320
320
321import Control.Concurrent (killThread, myThreadId, takeMVar, threadDelay)
321import Control.Concurrent (killThread, myThreadId, takeMVar, threadDelay)
322import Control.Exception
322import Control.Exception
323− (Exception, SomeException, AsyncException, fromException)
323+ (Exception, SomeException, AsyncException, fromException, mask_)
324import Control.Monad (void, when, forever)
324import Control.Monad (void, when, forever)
325import Control.Monad.Catch (MonadCatch, throwM)
325import Control.Monad.Catch (MonadCatch, throwM)
326import Control.Monad.IO.Class (MonadIO(..))
326import Control.Monad.IO.Class (MonadIO(..))
327import Control.Monad.Reader (ReaderT)
327import Control.Monad.Reader (ReaderT)
328import Control.Monad.State.Strict (StateT)
328import Control.Monad.State.Strict (StateT)
329import Control.Monad.Trans (MonadTrans(lift))
329import Control.Monad.Trans (MonadTrans(lift))
330−import Control.Monad.Trans.Control (MonadBaseControl)
330+import Control.Monad.Trans.Control (MonadBaseControl, liftBaseOp_)
331import Data.Bits (shiftR, shiftL, (.|.), (.&.))
331import Data.Bits (shiftR, shiftL, (.|.), (.&.))
332import Data.Functor.Identity (Identity(..))
332import Data.Functor.Identity (Identity(..))
333import Data.Int (Int64)
333import Data.Int (Int64)
@@ -2951,8 +2951,10 @@ gbracketIO bef exc aft fexc fnormal =
2951 -- weak pointer to us.
2951 -- weak pointer to us.
2952 {-# INLINE_LATE step #-}
2952 {-# INLINE_LATE step #-}
2953 step _ GBracketIOInit = do
2953 step _ GBracketIOInit = do
2954+ (r, ref) <- liftBaseOp_ mask_ $ do
2954− r <- bef
2955+ r <- bef
2955− ref <- newFinalizedIORef (aft r)
2956+ ref <- newFinalizedIORef (aft r)
2957+ return (r, ref)
2956 return $ Skip $ GBracketIONormal (fnormal r) r ref
2958 return $ Skip $ GBracketIONormal (fnormal r) r ref
2957
2959
2958 step gst (GBracketIONormal (UnStream step1 st) v ref) = do
2960 step gst (GBracketIONormal (UnStream step1 st) v ref) = do
src/Streamly/Internal/Data/Unfold.hs+10−6
@@ -131,9 +131,9 @@ module Streamly.Internal.Data.Unfold
131 )
131 )
132where
132where
133
133
134−import Control.Exception (Exception)
134+import Control.Exception (Exception, mask_)
135import Control.Monad.IO.Class (MonadIO(..))
135import Control.Monad.IO.Class (MonadIO(..))
136−import Control.Monad.Trans.Control (MonadBaseControl)
136+import Control.Monad.Trans.Control (MonadBaseControl, liftBaseOp_)
137import Data.Void (Void)
137import Data.Void (Void)
138import GHC.Types (SPEC(..))
138import GHC.Types (SPEC(..))
139import Prelude
139import Prelude
@@ -788,8 +788,10 @@ gbracketIO bef exc aft (Unfold estep einject) (Unfold step1 inject1) =
788 where
788 where
789
789
790 inject x = do
790 inject x = do
791+ (r, ref) <- liftBaseOp_ mask_ $ do
791− r <- bef x
792+ r <- bef x
792− ref <- D.newFinalizedIORef (aft r)
793+ ref <- D.newFinalizedIORef (aft r)
794+ return (r, ref)
793 s <- inject1 r
795 s <- inject1 r
794 return $ Right (s, r, ref)
796 return $ Right (s, r, ref)
795
797
@@ -1038,9 +1040,11 @@ bracketIO bef aft (Unfold step1 inject1) = Unfold step inject
1038 where
1040 where
1039
1041
1040 inject x = do
1042 inject x = do
1043+ (r, ref) <- liftBaseOp_ mask_ $ do
1041− r <- bef x
1044+ r <- bef x
1045+ ref <- D.newFinalizedIORef (aft r)
1046+ return (r, ref)
1042 s <- inject1 r
1047 s <- inject1 r
1043− ref <- D.newFinalizedIORef (aft r)
1044 return (s, ref)
1048 return (s, ref)
1045
1049
1046 {-# INLINE_LATE step #-}
1050 {-# INLINE_LATE step #-}