{-# LANGUAGE CPP #-}
module Plugin.GhcTags.FileLock
( withFileLock
, LockMode (..)
) where
import Control.Exception
#if !defined(mingw32_HOST_OS)
import Lukko.FLock
#else
import Lukko.Windows
#endif
withFileLock :: FilePath -> LockMode -> (FD -> IO x) -> IO x
withFileLock :: FilePath -> LockMode -> (FD -> IO x) -> IO x
withFileLock FilePath
path LockMode
mode FD -> IO x
k =
IO FD -> (FD -> IO ()) -> (FD -> IO x) -> IO x
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket
(FilePath -> IO FD
fdOpen FilePath
path)
(\FD
h -> FD -> IO ()
fdClose FD
h)
((FD -> IO x) -> IO x) -> (FD -> IO x) -> IO x
forall a b. (a -> b) -> a -> b
$ \FD
h ->
IO () -> (() -> IO ()) -> (() -> IO x) -> IO x
forall a b c. IO a -> (a -> IO b) -> (a -> IO c) -> IO c
bracket
(FD -> LockMode -> IO ()
fdLock FD
h LockMode
mode)
(\()
_ -> FD -> IO ()
fdUnlock FD
h)
(\()
_ -> FD -> IO x
k FD
h)