@@ -56,11 +56,6 @@ module Streamly.Core
57 , zipAsyncWith
57 , zipAsyncWith
59− -- XXX move to Streams.hs
64 -- * Concurrent Stream Vars (SVars)
59 -- * Concurrent Stream Vars (SVars)
66 , SVarStyle (..)
61 , SVarStyle (..)
@@ -73,15 +68,12 @@ where
73import Control.Concurrent (ThreadId, myThreadId, threadDelay)
68import Control.Concurrent (ThreadId, myThreadId, threadDelay)
74import Control.Concurrent.MVar (MVar, newEmptyMVar, tryTakeMVar,
69import Control.Concurrent.MVar (MVar, newEmptyMVar, tryTakeMVar,
75 tryPutMVar, takeMVar, putMVar)
70 tryPutMVar, takeMVar, putMVar)
76−import Control.Exception (SomeException (..))
71+import Control.Exception (SomeException (..), catch, mask)
77−import qualified Control.Exception.Lifted as EL
78import Control.Monad (when)
72import Control.Monad (when)
79import Control.Monad.Catch (MonadThrow, throwM)
73import Control.Monad.Catch (MonadThrow, throwM)
80−import Control.Monad.Error.Class (MonadError(..))
81import Control.Monad.IO.Class (MonadIO(..))
74import Control.Monad.IO.Class (MonadIO(..))
82−import Control.Monad.Reader.Class (MonadReader(..))
83import Control.Monad.Trans.Class (MonadTrans (lift))
75import Control.Monad.Trans.Class (MonadTrans (lift))
84−import Control.Monad.Trans.Control (MonadBaseControl, liftBaseWith)
76+import Control.Monad.Trans.Control (MonadBaseControl, control)
85import Data.Atomics (casIORef, readForCAS, peekTicket
77import Data.Atomics (casIORef, readForCAS, peekTicket
86 ,atomicModifyIORefCAS_)
78 ,atomicModifyIORefCAS_)
87import Data.Concurrent.Queue.MichaelScott (LinkedQueue, newQ, pushL,
79import Data.Concurrent.Queue.MichaelScott (LinkedQueue, newQ, pushL,
@@ -395,14 +387,14 @@ rawForkIO action = IO $ \ s ->
395{-# INLINE doFork #-}
387{-# INLINE doFork #-}
396doFork :: MonadBaseControl IO m
388doFork :: MonadBaseControl IO m
398− -> (SomeException -> m ())
390+ -> (SomeException -> IO ())
399 -> m ThreadId
391 -> m ThreadId
400doFork action exHandler =
392doFork action exHandler =
401− EL.mask $ \restore ->
393+ control $ \runInIO ->
402− liftBaseWith $ \runInIO -> rawForkIO $ do
394+ mask $ \restore -> do
403− _ <- runInIO $ EL.catch (restore action) exHandler
395+ tid <- rawForkIO $ catch (restore $ void $ runInIO action)
404− -- XXX restore state here?
396+ exHandler
405− return ()
397+ runInIO (return tid)
407-- XXX exception safety of all atomic/MVar operations
399-- XXX exception safety of all atomic/MVar operations
@@ -808,8 +800,8 @@ allThreadsDone :: MonadIO m => SVar m a -> m Bool
808allThreadsDone sv = liftIO $ S.null <$> readIORef (runningThreads sv)
800allThreadsDone sv = liftIO $ S.null <$> readIORef (runningThreads sv)
810{-# NOINLINE handleChildException #-}
802{-# NOINLINE handleChildException #-}
811−handleChildException :: MonadIO m => SVar m a -> SomeException -> m ()
803+handleChildException :: SVar m a -> SomeException -> IO ()
812−handleChildException sv e = liftIO $ do
804+handleChildException sv e = do
813 tid <- myThreadId
805 tid <- myThreadId
814 send sv (ChildStop tid (Just e))
806 send sv (ChildStop tid (Just e))
@@ -1335,21 +1327,3 @@ zipAsyncWith f m1 m2 = Stream $ \_ stp sng yld -> do
1336instance MonadTrans Stream where
1328instance MonadTrans Stream where
1337 lift = once
1329 lift = once
1339−withLocal :: MonadReader r m => (r -> r) -> Stream m a -> Stream m a
1341− Stream $ \svr stp sng yld ->
1342− let single = local f . sng
1343− yield a r = local f $ yld a (withLocal f r)
1344− in (runStream m) svr (local f stp) single yield
1346−-- XXX handle and test cross thread state transfer
1349− => Stream m a -> (e -> Stream m a) -> Stream m a
1350−withCatchError m h =
1351− Stream $ \svr stp sng yld ->
1352− let run x = runStream x svr stp sng yield
1353− handle r = r `catchError` \e -> run $ h e
1354− yield a r = yld a (withCatchError r h)