module Problem5 where
import Control.Concurrent.STM
data LockState = Locked | Unlocked
type Lock = TVar LockState
-- a)
newLock :: STM Lock
newLock = newTVar Unlocked
lock :: Lock -> STM ()
lock l = do
s <- readTVar l
case s of
Locked -> retry
Unlocked -> writeTVar l Locked
unlock :: Lock -> STM ()
unlock l = writeTVar l Unlocked
-- b)
criticalSection :: Lock -> IO a -> IO a
criticalSection l m = do
atomically $ lock l
x <- m
atomically $ unlock l
return x
-- c)
lockAny :: [Lock] -> STM Lock
lockAny [] = retry
lockAny (l:ls) =
do lock l
return l
`orElse`
lockAny ls