module HaskellWorks.CabalCache.Concurrent.Fork where import Control.Monad import qualified Control.Concurrent as IO import qualified Control.Concurrent.STM as STM forkThreadsWait :: Int -> IO () -> IO () forkThreadsWait n f = do tDone <- STM.atomically $ STM.newTVar (0 :: Int) forM_ [1 .. n] $ \_ -> IO.forkIO $ do f STM.atomically $ STM.modifyTVar tDone (+1) STM.atomically $ do done <- STM.readTVar tDone when (done < n) STM.retry