-- Hoogle documentation, generated by Haddock
-- See Hoogle, http://www.haskell.org/hoogle/

-- | Portable interface to file locking (flock / LockFileEx)
--   
--   This package provides an interface to Windows and Unix file locking
--   functionalities.
@package filelock
@version 0.1.1.8

-- | This module provides a portable interface to file locks as a mechanism
--   for inter-process synchronization.
--   
--   Each file lock is associated with a file. When taking a lock, the
--   assiciated file is created if it's not present, then the file is
--   locked in an OS-dependent way. While the lock is being held, no other
--   process or thread can take it, unless the specified
--   SharedExclusive values allow it.
--   
--   All locks held by a process are released when the process exits. They
--   can also be explicitly released using unlockFile.
--   
--   It is not recommended to open or otherwise use lock files for other
--   purposes, because it tends to expose differences between operating
--   systems. For example, on Windows openFile for a lock file will
--   fail when the lock is held, but on Unix it won't.
--   
--   Note on the implementation: currently the module uses flock(2) on
--   non-Windows platforms, and LockFileEx on Windows.
--   
--   On non-Windows platforms, InterruptibleFFI is used in the
--   implementation to ensures that blocking lock calls can be correctly
--   interrupted by async exceptions (e.g. functions like
--   timeout). This has been tested on Linux.
module System.FileLock

-- | A token that represents ownership of a lock.
data FileLock

-- | A type of lock to be taken.
data SharedExclusive

-- | Other process can hold a shared lock at the same time.
Shared :: SharedExclusive

-- | No other process can hold a lock, shared or exclusive.
Exclusive :: SharedExclusive

-- | Take a lock. This function blocks until the lock is available.
lockFile :: FilePath -> SharedExclusive -> IO FileLock

-- | Try to take a lock. This function does not block. If the lock is not
--   immediately available, it returns Nothing.
tryLockFile :: FilePath -> SharedExclusive -> IO (Maybe FileLock)

-- | Release the lock.
unlockFile :: FileLock -> IO ()

-- | Perform some action with a lock held. Blocks until the lock is
--   available.
withFileLock :: FilePath -> SharedExclusive -> (FileLock -> IO a) -> IO a

-- | Perform some action with a lock held. Non-blocking.
withTryFileLock :: FilePath -> SharedExclusive -> (FileLock -> IO a) -> IO (Maybe a)
instance GHC.Classes.Eq System.FileLock.FileLock
instance GHC.Classes.Eq System.FileLock.SharedExclusive
instance GHC.Internal.Show.Show System.FileLock.SharedExclusive
