mirror of
https://github.com/superseriousbusiness/gotosocial.git
synced 2024-06-13 18:59:27 +00:00
39 lines
727 B
Go
39 lines
727 B
Go
package storage
|
|
|
|
import (
|
|
"os"
|
|
"syscall"
|
|
|
|
"codeberg.org/gruf/go-store/util"
|
|
)
|
|
|
|
// LockFile is our standard lockfile name.
|
|
const LockFile = "store.lock"
|
|
|
|
type LockableFile struct {
|
|
*os.File
|
|
}
|
|
|
|
// OpenLock opens a lockfile at path.
|
|
func OpenLock(path string) (*LockableFile, error) {
|
|
file, err := open(path, defaultFileLockFlags)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return &LockableFile{file}, nil
|
|
}
|
|
|
|
func (f *LockableFile) Lock() error {
|
|
return f.flock(syscall.LOCK_EX | syscall.LOCK_NB)
|
|
}
|
|
|
|
func (f *LockableFile) Unlock() error {
|
|
return f.flock(syscall.LOCK_UN | syscall.LOCK_NB)
|
|
}
|
|
|
|
func (f *LockableFile) flock(how int) error {
|
|
return util.RetryOnEINTR(func() error {
|
|
return syscall.Flock(int(f.Fd()), how)
|
|
})
|
|
}
|