diff options
author | Joey Hess <joey@kitenet.net> | 2012-06-04 19:43:29 -0400 |
---|---|---|
committer | Joey Hess <joey@kitenet.net> | 2012-06-04 19:43:29 -0400 |
commit | cbf16f1967c247dfd41bc264fc994b6dae2620f9 (patch) | |
tree | e2401d09114e05fad32912db0a50a8af1ba404bc /Utility/ThreadLock.hs | |
parent | ec98581112070244d5cdd69d4228aeab856ce3eb (diff) |
refactor
Diffstat (limited to 'Utility/ThreadLock.hs')
-rw-r--r-- | Utility/ThreadLock.hs | 35 |
1 files changed, 35 insertions, 0 deletions
diff --git a/Utility/ThreadLock.hs b/Utility/ThreadLock.hs new file mode 100644 index 000000000..4285c0ec5 --- /dev/null +++ b/Utility/ThreadLock.hs @@ -0,0 +1,35 @@ +{- locking between threads + - + - Copyright 2012 Joey Hess <joey@kitenet.net> + - + - Licensed under the GNU GPL version 3 or higher. + -} + +module Utility.ThreadLock where + +import Common + +import System.Posix.Terminal +import Control.Concurrent.MVar +import System.Posix.Signals + +type Lock = MVar () + +newLock :: IO Lock +newLock = newMVar () + +{- Runs an action with a lock held, so only one thread at a time can run it. -} +withLock :: Lock -> IO a -> IO a +withLock lock = withMVar lock . const + +{- Pauses the main thread, letting children run until program termination. -} +waitForTermination :: IO () +waitForTermination = do + lock <- newEmptyMVar + check softwareTermination lock + whenM (queryTerminal stdInput) $ + check keyboardSignal lock + takeMVar lock + where + check sig lock = void $ + installHandler sig (CatchOnce $ putMVar lock ()) Nothing |