{-# 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

-- | 'flock' base lock (on posix) or `LockFileEx` on Windows.
--
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)