//go:build darwin || dragonfly || freebsd || linux || netbsd || openbsd package btree import ( "os" "syscall" ) type unixFileLock struct { f *os.File } func (fl *unixFileLock) release() error { if err := setFileLock(fl.f, false); err != nil { return err } return fl.f.Close() } func newFileLock(path string) (fl fileLock, err error) { flag := os.O_RDWR f, err := os.OpenFile(path, flag, 0) if os.IsNotExist(err) { f, err = os.OpenFile(path, flag|os.O_CREATE, 0644) } if err != nil { return } err = setFileLock(f, true) if err != nil { f.Close() return } fl = &unixFileLock{f: f} return } func setFileLock(f *os.File, lock bool) error { how := syscall.LOCK_UN if lock { how = syscall.LOCK_EX } return syscall.Flock(int(f.Fd()), how|syscall.LOCK_NB) }