shared lock support
This commit is contained in:
parent
cf453821ef
commit
5353429b8c
@ -11,12 +11,13 @@ func Test_FileLock(t *testing.T) {
|
||||
filename := "./test.file"
|
||||
lock := NewFileLock(filename)
|
||||
lock2 := NewFileLock(filename)
|
||||
fmt.Println("lock1", lock.LockNoBlocking())
|
||||
fmt.Println("lock1", lock.LockNoBlocking(false))
|
||||
time.Sleep(time.Second)
|
||||
fmt.Println("lock2", lock2.LockWithTimeout(time.Second*5))
|
||||
fmt.Println("lock2", lock2.LockWithTimeout(time.Second*5, false))
|
||||
fmt.Println("unlock1", lock.Unlock())
|
||||
time.Sleep(time.Second)
|
||||
fmt.Println("lock2", lock2.LockNoBlocking())
|
||||
fmt.Println("unlock2", lock2.Unlock())
|
||||
fmt.Println("lock2", lock2.LockNoBlocking(true))
|
||||
fmt.Println("unlock2", lock2.Unlock())
|
||||
os.Remove(filename)
|
||||
}
|
||||
|
@ -36,18 +36,30 @@ func (f *FileLock) openFileForLock() error {
|
||||
return nil
|
||||
}
|
||||
|
||||
func (f *FileLock) Lock() error {
|
||||
func (f *FileLock) Lock(Exclusive bool) error {
|
||||
var lockType int
|
||||
if Exclusive {
|
||||
lockType = syscall.LOCK_EX
|
||||
} else {
|
||||
lockType = syscall.LOCK_SH
|
||||
}
|
||||
if err := f.openFileForLock(); err != nil {
|
||||
return err
|
||||
}
|
||||
return syscall.Flock(f.fd, syscall.LOCK_EX)
|
||||
return syscall.Flock(f.fd, lockType)
|
||||
}
|
||||
|
||||
func (f *FileLock) LockNoBlocking() error {
|
||||
func (f *FileLock) LockNoBlocking(Exclusive bool) error {
|
||||
var lockType int
|
||||
if Exclusive {
|
||||
lockType = syscall.LOCK_EX
|
||||
} else {
|
||||
lockType = syscall.LOCK_SH
|
||||
}
|
||||
if err := f.openFileForLock(); err != nil {
|
||||
return err
|
||||
}
|
||||
err := syscall.Flock(f.fd, syscall.LOCK_EX|syscall.LOCK_NB)
|
||||
err := syscall.Flock(f.fd, lockType|syscall.LOCK_NB)
|
||||
if err != nil {
|
||||
syscall.Close(f.fd)
|
||||
if err == syscall.EWOULDBLOCK {
|
||||
@ -65,9 +77,9 @@ func (f *FileLock) Unlock() error {
|
||||
return syscall.Close(f.fd)
|
||||
}
|
||||
|
||||
func (f *FileLock) LockWithTimeout(tm time.Duration) error {
|
||||
func (f *FileLock) LockWithTimeout(tm time.Duration, Exclusive bool) error {
|
||||
return stario.StopUntilTimeout(tm, func(tmout chan struct{}) error {
|
||||
err := f.Lock()
|
||||
err := f.Lock(Exclusive)
|
||||
select {
|
||||
case <-tmout:
|
||||
f.Unlock()
|
||||
|
@ -88,16 +88,34 @@ func (f *FileLock) lockForTimeout(timeout time.Duration, lockType win32api.DWORD
|
||||
}
|
||||
}
|
||||
|
||||
func (f *FileLock) Lock() error {
|
||||
return f.lockForTimeout(0, win32api.LOCKFILE_EXCLUSIVE_LOCK)
|
||||
func (f *FileLock) Lock(Exclusive bool) error {
|
||||
var lockType win32api.DWORD
|
||||
if Exclusive {
|
||||
lockType = win32api.LOCKFILE_EXCLUSIVE_LOCK
|
||||
} else {
|
||||
lockType = 0
|
||||
}
|
||||
return f.lockForTimeout(0, lockType)
|
||||
}
|
||||
|
||||
func (f *FileLock) LockWithTimeout(tm time.Duration) error {
|
||||
return f.lockForTimeout(tm, win32api.LOCKFILE_EXCLUSIVE_LOCK)
|
||||
func (f *FileLock) LockWithTimeout(tm time.Duration, Exclusive bool) error {
|
||||
var lockType win32api.DWORD
|
||||
if Exclusive {
|
||||
lockType = win32api.LOCKFILE_EXCLUSIVE_LOCK
|
||||
} else {
|
||||
lockType = 0
|
||||
}
|
||||
return f.lockForTimeout(tm, lockType)
|
||||
}
|
||||
|
||||
func (f *FileLock) LockNoBlocking() error {
|
||||
return f.lockForTimeout(0, win32api.LOCKFILE_EXCLUSIVE_LOCK|win32api.LOCKFILE_FAIL_IMMEDIATELY)
|
||||
func (f *FileLock) LockNoBlocking(Exclusive bool) error {
|
||||
var lockType win32api.DWORD
|
||||
if Exclusive {
|
||||
lockType = win32api.LOCKFILE_EXCLUSIVE_LOCK
|
||||
} else {
|
||||
lockType = 0
|
||||
}
|
||||
return f.lockForTimeout(0, lockType|win32api.LOCKFILE_FAIL_IMMEDIATELY)
|
||||
}
|
||||
|
||||
func (f *FileLock) Unlock() error {
|
||||
|
Loading…
x
Reference in New Issue
Block a user