github.com/nsqio/nsq@v1.3.0/internal/dirlock/dirlock.go (about) 1 //go:build !windows && !illumos 2 // +build !windows,!illumos 3 4 package dirlock 5 6 import ( 7 "fmt" 8 "os" 9 "syscall" 10 ) 11 12 type DirLock struct { 13 dir string 14 f *os.File 15 } 16 17 func New(dir string) *DirLock { 18 return &DirLock{ 19 dir: dir, 20 } 21 } 22 23 func (l *DirLock) Lock() error { 24 f, err := os.Open(l.dir) 25 if err != nil { 26 return err 27 } 28 l.f = f 29 err = syscall.Flock(int(f.Fd()), syscall.LOCK_EX|syscall.LOCK_NB) 30 if err != nil { 31 return fmt.Errorf("cannot flock directory %s - %s (possibly in use by another instance of nsqd)", l.dir, err) 32 } 33 return nil 34 } 35 36 func (l *DirLock) Unlock() error { 37 defer l.f.Close() 38 return syscall.Flock(int(l.f.Fd()), syscall.LOCK_UN) 39 }