Revert "fix too early close of shared lock file"
This reverts commit66b2536ea0
. I misunderstood commitac56a5c2a0
and caused a FD leak when pid locking is not used. A LockHandle contains an action that will close the underlying lock file, and that action is run when it is closed. In the case of a shared lock, the lock file is opened once for each LockHandle, and only the one for the LockHandle that is being closed will be closed.
This commit is contained in:
parent
00625caf87
commit
ae4c56b28a
3 changed files with 21 additions and 9 deletions
|
@ -28,7 +28,6 @@ import System.FilePath.ByteString (RawFilePath)
|
|||
import qualified Data.Map.Strict as M
|
||||
import Control.Concurrent.STM
|
||||
import Control.Exception
|
||||
import Control.Monad
|
||||
|
||||
type LockFile = RawFilePath
|
||||
|
||||
|
@ -129,8 +128,8 @@ getLockStatus pool file getdefault checker = do
|
|||
Nothing -> getdefault
|
||||
Just restore -> bracket_ (return ()) restore checker
|
||||
|
||||
-- Only runs action to close underlying lock file when this is the last
|
||||
-- user of the lock, and when the lock has not already been closed.
|
||||
-- Releases the lock. When it is a shared lock, it may remain locked by
|
||||
-- other LockHandles.
|
||||
--
|
||||
-- Note that the lock pool is left empty while the CloseLockFile action
|
||||
-- is run, to avoid race with another thread trying to open the same lock
|
||||
|
@ -139,15 +138,15 @@ releaseLock :: LockHandle -> IO ()
|
|||
releaseLock h = go =<< atomically (tryTakeTMVar h)
|
||||
where
|
||||
go (Just (pool, file, closelockfile)) = do
|
||||
(m, lastuser) <- atomically $ do
|
||||
m <- atomically $ do
|
||||
m <- takeTMVar pool
|
||||
return $ case M.lookup file m of
|
||||
Just (LockStatus mode n firstlocksem)
|
||||
| n == 1 -> (M.delete file m, True)
|
||||
| n == 1 -> (M.delete file m)
|
||||
| otherwise ->
|
||||
(M.insert file (LockStatus mode (pred n) firstlocksem) m, False)
|
||||
Nothing -> (m, True)
|
||||
() <- when lastuser closelockfile
|
||||
(M.insert file (LockStatus mode (pred n) firstlocksem) m)
|
||||
Nothing -> m
|
||||
() <- closelockfile
|
||||
atomically $ putTMVar pool m
|
||||
-- The LockHandle was already closed.
|
||||
go Nothing = return ()
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue