packages feed

regions 0.6.0.1 → 0.7

raw patch · 3 files changed

+52/−13 lines, 3 files

Files

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