From ec7dd0446aa8f73886ecf9304b3affe14549b940 Mon Sep 17 00:00:00 2001 From: Joey Hess Date: Wed, 20 Aug 2014 17:03:04 -0400 Subject: [PATCH] more lock file refactoring --- Annex/Content.hs | 8 +++----- Logs/Transfer.hs | 8 ++------ Utility/LockFile/Posix.hs | 20 +++++++++++++++----- 3 files changed, 20 insertions(+), 16 deletions(-) diff --git a/Annex/Content.hs b/Annex/Content.hs index 31a4444afc..25c291ed1f 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 b6279ccbab..7928972b3d 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 1538b491ac..b49c5f1734 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