aboutsummaryrefslogtreecommitdiff
path: root/Utility/ThreadLock.hs
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2012-06-04 19:43:29 -0400
committerGravatar Joey Hess <joey@kitenet.net>2012-06-04 19:43:29 -0400
commitcbf16f1967c247dfd41bc264fc994b6dae2620f9 (patch)
treee2401d09114e05fad32912db0a50a8af1ba404bc /Utility/ThreadLock.hs
parentec98581112070244d5cdd69d4228aeab856ce3eb (diff)
refactor
Diffstat (limited to 'Utility/ThreadLock.hs')
-rw-r--r--Utility/ThreadLock.hs35
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