summaryrefslogtreecommitdiff
path: root/Utility/LockPool.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Utility/LockPool.hs')
-rw-r--r--Utility/LockPool.hs36
1 files changed, 36 insertions, 0 deletions
diff --git a/Utility/LockPool.hs b/Utility/LockPool.hs
new file mode 100644
index 000000000..2a4ac5101
--- /dev/null
+++ b/Utility/LockPool.hs
@@ -0,0 +1,36 @@
+{- Lock pool.
+ -
+ - This avoids a problem with unix fcntl locks: They are not composition-safe.
+ -
+ - For example, if one thread is holding a lock, and another thread opens the
+ - lock file (to attempt to take or check the lock), and then closes it,
+ - the lock will be released, despite the first thread still having the
+ - lockfile open.
+ -
+ - Or, if a process is already holding an exclusive lock on a file, an
+ - re-opens it and tries to take another exclusive lock, it won't block
+ - on the first lock.
+ -
+ - To avoid these problems, this implements a lock pool. This keeps track
+ - of which lock files are being used by the process, and avoids
+ - re-opening them. Instead, if a lockfile is in use by the current
+ - process, STM is used to handle further concurrent uses of that lock
+ - file.
+ -
+ - Note that, like Utility.LockFile, this does *not* attempt to be a
+ - portability shim; the native locking of the OS is used.
+ -
+ - Copyright 2015 Joey Hess <id@joeyh.name>
+ -
+ - License: BSD-2-clause
+ -}
+
+{-# LANGUAGE CPP #-}
+
+module Utility.LockPool (module X) where
+
+#ifndef mingw32_HOST_OS
+import Utility.LockPool.Posix as X
+#else
+import Utility.LockPool.Windows as X
+#endif