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 }