fslock provides a cross-process mutex based on file locks that works on windows and *nix platforms.
image: public domain (don't ask)
fslock relies on LockFileEx on Windows and flock on *nix systems. The timeout feature uses overlapped IO on Windows, but on *nix platforms, timing out requires the use of a goroutine that will run until the lock is acquired, regardless of timeout. If you need to avoid this use of goroutines, poll TryLock in a loop.
var ErrLocked error = trylockError("fslock is already locked")
ErrLocked indicates TryLock failed because the lock was already locked.
var ErrTimeout error = timeoutError("lock timeout exceeded")
ErrTimeout indicates that the lock attempt timed out.
type Lock struct {
// contains filtered or unexported fields
}
Lock implements cross-process locks using syscalls.
func New(filename string) *Lock
New returns a new lock around the given file.
func (l *Lock) Lock() error
Lock locks the lock. This call will block until the lock is available.
func (l *Lock) LockWithTimeout(timeout time.Duration) error
LockWithTimeout tries to lock the lock until the timeout expires. If the timeout expires, this method will return ErrTimeout.
func (l *Lock) TryLock() error
TryLock attempts to lock the lock. This method will return ErrLocked immediately if the lock cannot be acquired.
func (l *Lock) Unlock() error
Unlock unlocks the lock.