regions 0.6.0.1 → 0.7
raw patch · 3 files changed
+52/−13 lines, 3 files
Files
- Control/Monad/Trans/Region.hs +7/−1
- Control/Monad/Trans/Region/Internal.hs +44/−11
- regions.cabal +1/−1
Control/Monad/Trans/Region.hs view
@@ -1,3 +1,4 @@+{-# LANGUAGE CPP #-} ------------------------------------------------------------------------------- -- |@@ -22,8 +23,13 @@ , TopRegion , runTopRegion- , forkTopRegion + -- ** Forking /top-level/ regions+ , forkIOTopRegion+ , forkOSTopRegion+#ifdef __GLASGOW_HASKELL__+ , forkOnIOTopRegion+#endif -- * Duplication , Dup(dup)
Control/Monad/Trans/Region/Internal.hs view
@@ -1,4 +1,5 @@-{-# LANGUAGE UnicodeSyntax+{-# LANGUAGE CPP+ , UnicodeSyntax , NoImplicitPrelude , GeneralizedNewtypeDeriving , RankNTypes@@ -37,7 +38,12 @@ , TopRegion , runTopRegion - , forkTopRegion+ -- ** Forking /top-level/ regions+ , forkIOTopRegion+ , forkOSTopRegion+#ifdef __GLASGOW_HASKELL__+ , forkOnIOTopRegion+#endif -- * Duplication , Dup(dup)@@ -55,7 +61,6 @@ -- from base: import Prelude ( (+), (-), seq, fromInteger )-import Control.Concurrent ( forkIO, ThreadId ) import Control.Applicative ( Applicative, Alternative ) import Control.Monad ( Monad, return, (>>=), fail , (>>), when, forM_@@ -69,6 +74,11 @@ import Data.IORef ( IORef, newIORef , readIORef, modifyIORef, atomicModifyIORef )+import Control.Concurrent ( forkIO, forkOS, ThreadId )+#ifdef __GLASGOW_HASKELL__+import GHC.Conc ( forkOnIO )+#endif+ -- from MonadCatchIO-transformers: import Control.Monad.CatchIO ( MonadCatchIO, block, bracket ) @@ -175,6 +185,11 @@ runTopRegion ∷ (∀ s. TopRegion s α) → IO α runTopRegion = runRegionT ++--------------------------------------------------------------------------------+-- ** Forking /top-level/ regions+--------------------------------------------------------------------------------+ {-| Return a region which executes the given /top-level/ region in a new thread. Note that the forked region has the same type variable @s@ as the resulting@@ -184,9 +199,9 @@ For example the following is allowed: @-runRegionT $ do+'runRegionT' $ do regionalHndl <- open resource- threadId <- forkTopRegion $ doSomethingWith regionalHndl+ threadId <- 'forkIOTopRegion' $ doSomethingWith regionalHndl doSomethingElseWith regionalHndl @ @@ -194,12 +209,30 @@ thread are closed only when the current thread or the forked thread terminates whichever comes /last/. -}-forkTopRegion ∷ MonadIO pr ⇒ TopRegion s () → RegionT s pr ThreadId-forkTopRegion m = RegionT $ ReaderT $ \hsIORef → liftIO $ do- hs ← readIORef hsIORef- block $ do- forM_ hs $ \(Handle _ refCntIORef) → increment refCntIORef- forkIO $ runRegionWith hs m+forkIOTopRegion ∷ MonadIO pr ⇒ TopRegion s () → RegionT s pr ThreadId+forkIOTopRegion = forkTopRegion forkIO++-- | Like 'forkIOTopRegion' but internally uses 'forkOS'.+forkOSTopRegion ∷ MonadIO pr ⇒ TopRegion s () → RegionT s pr ThreadId+forkOSTopRegion = forkTopRegion forkOS++#ifdef __GLASGOW_HASKELL__+-- | Like 'forkIOTopRegion' but internally uses 'forkOnIO'.+forkOnIOTopRegion ∷ MonadIO pr ⇒ Int → TopRegion s () → RegionT s pr ThreadId+forkOnIOTopRegion = forkTopRegion ∘ forkOnIO+#endif++forkTopRegion ∷ MonadIO pr+ ⇒ (IO () → IO ThreadId)+ → (TopRegion s () → RegionT s pr ThreadId)+forkTopRegion doFork = \m →+ RegionT $ ReaderT $ \hsIORef → liftIO $ do+ hs ← readIORef hsIORef+ block $ do+ forM_ hs $ \(Handle _ refCntIORef) → increment refCntIORef+ doFork $ runRegionWith hs m++-------------------------------------------------------------------------------- -- | Internally used function that actually runs the region on the given list of -- opened resources.
regions.cabal view
@@ -1,5 +1,5 @@ name: regions-version: 0.6.0.1+version: 0.7 cabal-version: >=1.6 build-type: Simple license: BSD3