lock pools to work around non-concurrency/composition safety of POSIX fcntl
This commit is contained in:
parent
af6b313456
commit
6915b71c57
8 changed files with 327 additions and 12 deletions
59
Utility/LockPool/Posix.hs
Normal file
59
Utility/LockPool/Posix.hs
Normal file
|
@ -0,0 +1,59 @@
|
|||
{- Posix lock files, using lock pools.
|
||||
-
|
||||
- Copyright 2015 Joey Hess <id@joeyh.name>
|
||||
-
|
||||
- License: BSD-2-clause
|
||||
-}
|
||||
|
||||
module Utility.LockPool.Posix (
|
||||
LockHandle,
|
||||
lockShared,
|
||||
lockExclusive,
|
||||
tryLockExclusive,
|
||||
checkLocked,
|
||||
getLockStatus,
|
||||
dropLock,
|
||||
checkSaneLock,
|
||||
) where
|
||||
|
||||
import qualified Utility.LockFile.Posix as F
|
||||
import qualified Utility.LockPool.STM as P
|
||||
import Utility.LockPool.STM (LockPool, LockFile, LockMode(..))
|
||||
import Utility.LockPool.LockHandle
|
||||
import Utility.Monad
|
||||
|
||||
import Control.Concurrent.STM
|
||||
import System.IO
|
||||
import System.Posix
|
||||
import Data.Maybe
|
||||
import Control.Applicative
|
||||
import Prelude
|
||||
|
||||
-- Takes a shared lock, blocking until the lock is available.
|
||||
lockShared :: Maybe FileMode -> LockFile -> IO LockHandle
|
||||
lockShared mode file = makeLockHandle
|
||||
(P.waitTakeLock P.lockPool file LockShared)
|
||||
(F.lockShared mode file)
|
||||
|
||||
lockExclusive :: Maybe FileMode -> LockFile -> IO LockHandle
|
||||
lockExclusive mode file = makeLockHandle
|
||||
(P.waitTakeLock P.lockPool file LockExclusive)
|
||||
(F.lockExclusive mode file)
|
||||
|
||||
tryLockExclusive :: Maybe FileMode -> LockFile -> IO (Maybe LockHandle)
|
||||
tryLockExclusive mode file = tryMakeLockHandle
|
||||
(P.tryTakeLock P.lockPool file LockExclusive)
|
||||
(F.tryLockExclusive mode file)
|
||||
|
||||
-- Returns Nothing when the file doesn't exist, for cases where
|
||||
-- that is different from it not being locked.
|
||||
checkLocked :: LockFile -> IO (Maybe Bool)
|
||||
checkLocked file = P.getLockStatus P.lockPool file (pure True)
|
||||
(F.checkLocked file)
|
||||
|
||||
getLockStatus :: LockFile -> IO (Maybe ProcessID)
|
||||
getLockStatus file = P.getLockStatus P.lockPool file getProcessID
|
||||
(F.getLockStatus file)
|
||||
|
||||
checkSaneLock :: LockFile -> LockHandle -> IO Bool
|
||||
checkSaneLock lockfile (LockHandle _ fh) = F.checkSaneLock lockfile fh
|
Loading…
Add table
Add a link
Reference in a new issue