better lock dropping order
authorJoey Hess <joeyh@joeyh.name>
Fri, 13 Nov 2015 16:36:37 +0000 (12:36 -0400)
committerJoey Hess <joeyh@joeyh.name>
Fri, 13 Nov 2015 16:36:37 +0000 (12:36 -0400)
Utility/LockFile/PidLock.hs

index ac1df253d66c8054f696bc849569a706e99a93ae..94c70e714d7156f57b7ba07633104b1b0fc82ea3 100644 (file)
@@ -20,7 +20,6 @@ import Utility.PartialPrelude
 import Utility.Exception
 import Utility.Applicative
 import Utility.Directory
-import Utility.ThreadScheduler
 import Utility.Monad
 import Utility.Path
 import Utility.FileMode
@@ -127,10 +126,14 @@ waitLock (Seconds timeout) lockfile = go timeout
                        error $ "Gave up waiting for possibly stale pid lock file " ++ lockfile
 
 dropLock :: LockHandle -> IO ()
-dropLock (LockHandle lockfile fd plh) = do
+dropLock (LockHandle lockfile fd sidelock) = do
+       -- Drop side lock first, at which point the pid lock will be
+       -- considered stale.
+       -- The side lock file cannot be deleted because another process may
+       -- have it open and be waiting to lock it.
+       maybe noop Posix.dropLock sidelock
        closeFd fd
        nukeFile lockfile
-       maybe noop Posix.dropLock plh
 
 getLockStatus :: LockFile -> IO LockStatus
 getLockStatus = maybe StatusUnLocked (StatusLockedBy . lockingPid) <$$> readPidLock