summaryrefslogtreecommitdiff
path: root/Utility/LockFile/Posix.hs
diff options
context:
space:
mode:
Diffstat (limited to 'Utility/LockFile/Posix.hs')
-rw-r--r--Utility/LockFile/Posix.hs16
1 files changed, 12 insertions, 4 deletions
diff --git a/Utility/LockFile/Posix.hs b/Utility/LockFile/Posix.hs
index 1e43a2832..6e4444fcf 100644
--- a/Utility/LockFile/Posix.hs
+++ b/Utility/LockFile/Posix.hs
@@ -14,6 +14,7 @@ module Utility.LockFile.Posix (
openExistingLockFile,
isLocked,
checkLocked,
+ getLockStatus,
dropLock,
) where
@@ -23,7 +24,6 @@ import Utility.Applicative
import System.IO
import System.Posix
import Data.Maybe
-import Control.Applicative
type LockFile = FilePath
@@ -77,15 +77,23 @@ openLockFile filemode lockfile = do
isLocked :: LockFile -> IO Bool
isLocked = fromMaybe False <$$> checkLocked
+-- 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 lockfile = go =<< catchMaybeIO open
+checkLocked = maybe Nothing (Just . isJust) <$$> getLockStatus'
+
+getLockStatus :: LockFile -> IO (Maybe (ProcessID, FileLock))
+getLockStatus = fromMaybe Nothing <$$> getLockStatus'
+
+getLockStatus' :: LockFile -> IO (Maybe (Maybe (ProcessID, FileLock)))
+getLockStatus' lockfile = go =<< catchMaybeIO open
where
open = openFd lockfile ReadOnly Nothing defaultFileFlags
go Nothing = return Nothing
go (Just h) = do
- ret <- isJust <$> getLock h (ReadLock, AbsoluteSeek, 0, 0)
+ ret <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
closeFd h
- return $ Just ret
+ return (Just ret)
dropLock :: LockHandle -> IO ()
dropLock (LockHandle fd) = closeFd fd