caf 0.0.2 → 0.0.3
raw patch · 2 files changed
+75/−1 lines, 2 files
Files
- Control/Concurrent/Futures/Barrier.hs +73/−0
- caf.cabal +2/−1
+ Control/Concurrent/Futures/Barrier.hs view
@@ -0,0 +1,73 @@+{- |+Module : <File name or $Header$ to be replaced automatically>+Description : This module implements barrier using futures.+Maintainer : willig@ki.informatik.uni-frankfurt.de+Stability : experimental+Portability : non-portable (requires Futures)++This module implements barrier using futures.+A rendezvous ensures that two threads meet at a specific point before+continuing their computation. The rendezvous idiom blocks at this point+until both threads have arrived. A barrier is a rendezvous for a+group of processes. Assume that a application is divided into phases where+a couple of threads compute several interims to be the input for the next+phase. Then all threads must complete the current phase before entering+the next. To achieve this behaviour a barrier is placed at the end of a phase.+Note that a barriers is purely for synchronisation and not for exchange of+data.++Warning: All operations on barrier should only be used within the global wrapper function+'Futures.withFuturesDo'!+-}+module Control.Concurrent.Futures.Barrier (+ Bar,+ newBar,+ syncBar+) where+import Control.Concurrent.Futures.Futures as Futures+import Control.Concurrent.Futures.Buffer as Buffer++-- | A new barrier type contains of a buffer containing the count of active threads,+-- a buffer containing the a count of finished threads and a capacity. +type Bar a = (Buffer a, Buffer [Bool -> IO ()], Int)++-- | Creates a new barrier.+newBar :: Int -> IO (Buffer Int, Buffer [Bool -> IO ()], Int)+newBar n = do+ cnt_act <- Buffer.newBuf+ cnt_fin <- Buffer.newBuf+ putBuf cnt_fin []+ putBuf cnt_act n+ return (cnt_act,cnt_fin,n)++-- | syncs on the barrier+syncBar :: (Buffer Int, Buffer [Bool -> IO ()], Int) -> IO Bool+syncBar (cnt_act,cnt_fin,k) = do+ act <- Buffer.getBuf cnt_act+ fin <- Buffer.getBuf cnt_fin+ case (act==1) of+ True -> do + openBar fin+ Buffer.putBuf cnt_act k+ Buffer.putBuf cnt_fin []+ return True+ False -> do+ Buffer.putBuf cnt_act (act-1)+ (h,f) <- Futures.newhandled+ Buffer.putBuf cnt_fin (h:fin)+ wait f++-- | opens all synced threads +openBar :: [Bool -> IO ()] -> IO ()+openBar ls = case ls of+ x:xs -> do + x True+ openBar xs+ [] -> return ()+ +-- | Waits its argument to become true.+wait :: Bool -> IO Bool+wait x = do+ case x of+ True -> return x+ otherwise -> return x
caf.cabal view
@@ -1,5 +1,5 @@ Name: caf-Version: 0.0.2+Version: 0.0.3 Description: This library contains implementations of several kinds of futures and concurrency abstractions. License: BSD3 License-file: LICENSE@@ -28,6 +28,7 @@ Control.Concurrent.Futures.QSem Control.Concurrent.Futures.BChan Control.Concurrent.Futures.HQSem+ Control.Concurrent.Futures.Barrier Build-Depends: base >= 2.0