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  }