summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Annex/Content.hs47
-rw-r--r--Utility/LockFile/Posix.hs11
2 files changed, 24 insertions, 34 deletions
diff --git a/Annex/Content.hs b/Annex/Content.hs
index 801bbdef2..ad570ee4e 100644
--- a/Annex/Content.hs
+++ b/Annex/Content.hs
@@ -150,10 +150,14 @@ inAnnexSafe key = inAnnex' (fromMaybe False) (Just False) go key
- file from the content, since locking the actual content file
- would interfere with the user's use of it. -}
contentLockFile :: Key -> Annex (Maybe FilePath)
+#ifndef mingw32_HOST_OS
contentLockFile key = ifM isDirect
( Just <$> calcRepo (gitAnnexContentLock key)
, return Nothing
)
+#else
+contentLockFile key = Just <$> calcRepo (gitAnnexContentLock key)
+#endif
newtype ContentLock = ContentLock Key
@@ -164,43 +168,40 @@ lockContent :: Key -> (ContentLock -> Annex a) -> Annex a
lockContent key a = do
contentfile <- calcRepo $ gitAnnexLocation key
lockfile <- contentLockFile key
- maybe noop setuplockfile lockfile
bracket
(lock contentfile lockfile)
(unlock lockfile)
- (const $ a $ ContentLock key)
+ (const $ a $ ContentLock key )
where
alreadylocked = error "content is locked"
- setuplockfile lockfile = modifyContent lockfile $
- void $ liftIO $ tryIO $
- writeFile lockfile ""
+ failedtolock e = error $ "failed to lock content: " ++ show e
+ trylock locker = locker `catchIO` failedtolock
cleanuplockfile lockfile = modifyContent lockfile $
void $ liftIO $ tryIO $
nukeFile lockfile
#ifndef mingw32_HOST_OS
- lock contentfile Nothing = liftIO $
- opencontentforlock contentfile >>= dolock
- lock _ (Just lockfile) = do
- mode <- annexFileMode
- liftIO $ createLockFile mode lockfile >>= dolock . Just
{- Since content files are stored with the write bit disabled, have
- to fiddle with permissions to open for an exclusive lock. -}
- opencontentforlock f = catchDefaultIO Nothing $
- withModifiedFileMode f
- (`unionFileModes` ownerWriteMode)
- (openExistingLockFile f)
- dolock Nothing = return Nothing
- dolock (Just fd) = do
- v <- tryIO $ setLock fd (WriteLock, AbsoluteSeek, 0, 0)
- case v of
- Left _ -> alreadylocked
- Right _ -> return $ Just fd
- unlock mlockfile mfd = do
+ lock contentfile Nothing = trylock $ liftIO $
+ withModifiedFileMode contentfile
+ (`unionFileModes` ownerWriteMode) $
+ maybe alreadylocked return
+ =<< tryLockExclusive Nothing contentfile
+ lock _ (Just lockfile) = trylock $ do
+ mode <- annexFileMode
+ maybe alreadylocked return
+ =<< modifyContent lockfile
+ (liftIO $ tryLockExclusive (Just mode) lockfile)
+ unlock mlockfile lck = do
maybe noop cleanuplockfile mlockfile
- liftIO $ maybe noop closeFd mfd
+ liftIO $ dropLock lck
#else
- lock _ (Just lockfile) = liftIO $
+ lock _ (Just lockfile) = do
+ modifyContent lockfile $
+ void $ liftIO $ tryIO $
+ writeFile lockfile ""
maybe alreadylocked (return . Just) =<< lockExclusive lockfile
+ -- never reached; windows always uses a separate lock file
lock _ Nothing = return Nothing
unlock mlockfile mlockhandle = do
liftIO $ maybe noop dropLock mlockhandle
diff --git a/Utility/LockFile/Posix.hs b/Utility/LockFile/Posix.hs
index 12275c48a..65ba328df 100644
--- a/Utility/LockFile/Posix.hs
+++ b/Utility/LockFile/Posix.hs
@@ -10,8 +10,6 @@ module Utility.LockFile.Posix (
lockShared,
lockExclusive,
tryLockExclusive,
- createLockFile,
- openExistingLockFile,
checkLocked,
getLockStatus,
dropLock,
@@ -56,15 +54,6 @@ lock lockreq mode lockfile = do
waitToSetLock l (lockreq, AbsoluteSeek, 0, 0)
return (LockHandle l)
--- Create and opens lock file; does not lock it.
-createLockFile :: FileMode -> LockFile -> IO Fd
-createLockFile filemode = openLockFile (Just filemode)
-
--- Opens an existing lock file; does not lock it, and if it does not exist,
--- returns Nothing.
-openExistingLockFile :: LockFile -> IO (Maybe Fd)
-openExistingLockFile = catchMaybeIO . openLockFile Nothing
-
-- Close on exec flag is set so child processes do not inherit the lock.
openLockFile :: Maybe FileMode -> LockFile -> IO Fd
openLockFile filemode lockfile = do