github.com/piotrnar/gocoin@v0.0.0-20240512203912-faa0448c5e96/lib/others/sys/dblock_unix.go (about)

     1  // +build !windows
     2  
     3  package sys
     4  
     5  import (
     6  	"os"
     7  	"syscall"
     8  )
     9  
    10  var (
    11  	DbLockFileName string
    12  	DbLockFileHndl *os.File
    13  )
    14  
    15  func LockDatabaseDir(GocoinHomeDir string) {
    16  	os.MkdirAll(GocoinHomeDir, 0770)
    17  	DbLockFileName = GocoinHomeDir+".lock"
    18  	DbLockFileHndl, _ = os.Open(DbLockFileName)
    19  	if DbLockFileHndl==nil {
    20  		DbLockFileHndl, _ = os.Create(DbLockFileName)
    21  	}
    22  	if DbLockFileHndl==nil {
    23  		goto error
    24  	}
    25  
    26  	if e:=syscall.Flock(int(DbLockFileHndl.Fd()), syscall.LOCK_EX|syscall.LOCK_NB); e!=nil {
    27  		goto error
    28  	}
    29  	return
    30  
    31  error:
    32  	println("Could not lock the databse folder for writing. Another instance might be running.")
    33  	println("If it is not the case, remove this file:", DbLockFileName)
    34  	os.Exit(1)
    35  }
    36  
    37  func UnlockDatabaseDir() {
    38  	syscall.Flock(int(DbLockFileHndl.Fd()), syscall.LOCK_UN)
    39  	DbLockFileHndl.Close()
    40  	os.Remove(DbLockFileName)
    41  }