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 }