github.com/nevalang/neva@v0.23.1-0.20240507185603-7696a9bb8dda/internal/builder/lock.go (about) 1 package builder 2 3 import ( 4 "fmt" 5 "os" 6 "path/filepath" 7 "time" 8 ) 9 10 func acquireLockFile() (release func(), err error) { 11 home, err := os.UserHomeDir() 12 if err != nil { 13 return nil, err 14 } 15 16 filename := filepath.Join(home, "neva", ".lock") 17 18 for i := 0; i < 60; i++ { 19 f, err := os.OpenFile( 20 filename, 21 os.O_CREATE|os.O_EXCL, 22 0755, 23 ) 24 if err == nil { 25 return func() { 26 if err := os.Remove(filename); err != nil { 27 panic(err) 28 } 29 if err := f.Close(); err != nil { 30 panic(err) 31 } 32 }, nil 33 } 34 35 if !os.IsExist(err) { 36 return nil, fmt.Errorf( 37 "unexpected error acquiring neva lock file: %v", 38 err, 39 ) 40 } 41 42 time.Sleep(1 * time.Second) 43 } 44 45 return nil, fmt.Errorf( 46 "maximum retry attempts while acquiring the neva lock file (does %s exist?)", 47 filename, 48 ) 49 }