github.com/nilium/gitlab-runner@v12.5.0+incompatible/helpers/fslocker/fslocker.go (about)

     1  package fslocker
     2  
     3  import (
     4  	"github.com/gofrs/flock"
     5  )
     6  
     7  type locker interface {
     8  	TryLock() (bool, error)
     9  	Unlock() error
    10  }
    11  
    12  var defaultLocker = func(path string) locker {
    13  	return flock.New(path)
    14  }
    15  
    16  func InLock(filePath string, fn func()) (err error) {
    17  	locker := defaultLocker(filePath)
    18  
    19  	lock, err := locker.TryLock()
    20  	if err != nil {
    21  		return errCantAcquireLock(err, filePath)
    22  	}
    23  
    24  	if !lock {
    25  		return errFileInUse(filePath)
    26  	}
    27  
    28  	defer func() {
    29  		unlockErr := locker.Unlock()
    30  		if unlockErr != nil {
    31  			err = errCantReleaseLock(unlockErr, filePath)
    32  		}
    33  	}()
    34  
    35  	fn()
    36  
    37  	return
    38  }