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  }