summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGravatar Joey Hess <joey@kitenet.net>2014-08-20 17:03:04 -0400
committerGravatar Joey Hess <joey@kitenet.net>2014-08-20 17:03:04 -0400
commit7165e4035e9b6cfeaa5d659341749cc957b27e14 (patch)
treed78cfbd2483336adb49e82de82efe27c3fc53e7d
parent679d9c0027ac996eea9f41a6f0f39af436801e89 (diff)
more lock file refactoring
-rw-r--r--Annex/Content.hs8
-rw-r--r--Logs/Transfer.hs8
-rw-r--r--Utility/LockFile/Posix.hs20
3 files changed, 20 insertions, 16 deletions
diff --git a/Annex/Content.hs b/Annex/Content.hs
index 31a4444af..25c291ed1 100644
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -101,18 +101,16 @@ inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key
=<< contentLockFile key
#ifndef mingw32_HOST_OS
- checkindirect f = liftIO $ openforlock f >>= check is_missing
+ checkindirect f = liftIO $ openExistingLockFile f >>= check is_missing
{- In direct mode, the content file must exist, but
- the lock file often generally won't exist unless a removal is in
- process. This does not create the lock file, it only checks for
- it. -}
checkdirect contentfile lockfile = liftIO $
ifM (doesFileExist contentfile)
- ( openforlock lockfile >>= check is_unlocked
+ ( openExistingLockFile lockfile >>= check is_unlocked
, return is_missing
)
- openforlock f = catchMaybeIO $
- openFd f ReadOnly Nothing defaultFileFlags
check _ (Just h) = do
v <- getLock h (ReadLock, AbsoluteSeek, 0, 0)
closeFd h
@@ -180,7 +178,7 @@ lockContent key a = do
opencontentforlock f = catchMaybeIO $ ifM (doesFileExist f)
( withModifiedFileMode f
(`unionFileModes` ownerWriteMode)
- (createLockFie Nothing f)
+ (createLockFile Nothing f)
, createLockFile Nothing f
)
dolock Nothing = return Nothing
diff --git a/Logs/Transfer.hs b/Logs/Transfer.hs
index b6279ccba..7928972b3 100644
--- a/Logs/Transfer.hs
+++ b/Logs/Transfer.hs
@@ -17,9 +17,7 @@ import Utility.Metered
import Utility.Percentage
import Utility.QuickCheck
import Utility.PID
-#ifdef mingw32_HOST_OS
-import Utility.WinLock
-#endif
+import Utility.LockFile
import Data.Time.Clock
import Data.Time.Clock.POSIX
@@ -131,9 +129,7 @@ checkTransfer :: Transfer -> Annex (Maybe TransferInfo)
checkTransfer t = do
tfile <- fromRepo $ transferFile t
#ifndef mingw32_HOST_OS
- mode <- annexFileMode
- mfd <- liftIO $ catchMaybeIO $
- openFd (transferLockFile tfile) ReadOnly (Just mode) defaultFileFlags
+ mfd <- liftIO $ openExistingLockFile (transferLockFile tfile)
case mfd of
Nothing -> return Nothing -- failed to open file; not running
Just fd -> do
diff --git a/Utility/LockFile/Posix.hs b/Utility/LockFile/Posix.hs
index 1538b491a..b49c5f173 100644
--- a/Utility/LockFile/Posix.hs
+++ b/Utility/LockFile/Posix.hs
@@ -6,13 +6,16 @@
-}
module Utility.LockFile.Posix (
+ LockHandle,
lockShared,
lockExclusive,
dropLock,
createLockFile,
- LockHandle
+ openExistingLockFile,
) where
+import Utility.Exception
+
import System.IO
import System.Posix
@@ -35,11 +38,18 @@ lock lockreq mode lockfile = do
waitToSetLock l (lockreq, AbsoluteSeek, 0, 0)
return (LockHandle l)
--- Create and opens lock file, does not lock it.
--- Close on exec flag is set so child processes do not inherit the lock.
+-- Create and opens lock file; does not lock it.
createLockFile :: Maybe FileMode -> LockFile -> IO Fd
-createLockFile mode lockfile = do
- l <- openFd lockfile ReadWrite mode defaultFileFlags
+createLockFile = openLockFile ReadWrite
+
+-- Opens an existing lock file; does not lock it or create it.
+openExistingLockFile :: LockFile -> IO (Maybe Fd)
+openExistingLockFile = catchMaybeIO . openLockFile ReadOnly Nothing
+
+-- Close on exec flag is set so child processes do not inherit the lock.
+openLockFile :: OpenMode -> Maybe FileMode -> LockFile -> IO Fd
+openLockFile openmode filemode lockfile = do
+ l <- openFd lockfile openmode filemode defaultFileFlags
setFdOption l CloseOnExec True
return l