packages feed

threadmanager 0.1.4 → 0.1.5

raw patch · 2 files changed

+15/−7 lines, 2 filesdep ~basedep ~containers

Dependency ranges changed: base, containers

Files

src/Control/Concurrent/ThreadManager.hs view
@@ -15,9 +15,9 @@   ) where  import Control.Concurrent      (ThreadId, forkIO)-import Control.Concurrent.MVar (MVar, modifyMVar, newEmptyMVar, newMVar, putMVar, takeMVar, tryTakeMVar)+import Control.Concurrent.MVar (MVar, modifyMVar, newEmptyMVar, newMVar, putMVar, takeMVar, tryTakeMVar, readMVar) import Control.Exception       (SomeException, try)-import Control.Monad           (join, replicateM)+import Control.Monad           (join, replicateM, when) import qualified Data.Map as M  data ThreadStatus =@@ -70,7 +70,15 @@  -- | Block until all managed threads terminate. waitForAll :: ThreadManager -> IO ()-waitForAll (TM tm) =-    modifyMVar tm elems >>= mapM_ takeMVar+waitForAll tm@(TM tmMvar) = do+    threadMap <- readMVar tmMvar+    let threads = M.keys threadMap+    statuses <- mapM (getStatus tm) threads+    _ <- mapM (waitFor tm) threads+    Control.Monad.when (foldr checkStatus False statuses) $+        waitForAll tm   where-    elems m = return (M.empty, M.elems m)+    checkStatus :: Maybe ThreadStatus -> Bool -> Bool+    checkStatus _ True = True+    checkStatus (Just Running) False = True+    checkStatus _ False = False
threadmanager.cabal view
@@ -1,5 +1,5 @@ name:    threadmanager-version: 0.1.4+version: 0.1.5  category: Concurrency @@ -24,7 +24,7 @@ library     hs-source-dirs:  src     exposed-modules: Control.Concurrent.ThreadManager-    build-depends:   base == 4.*, containers >= 0.2.0.0 && <= 0.4.0.0+    build-depends:   base >= 3 && < 5, containers     ghc-options:     -Wall     if impl(ghc >= 6.8)         ghc-options: -fwarn-tabs