Skip to content

Commit 8a39eb4

Browse files
committed
Merge pull request #43 from azr/release_failed_flock
Release failed flock
2 parents 5135e61 + 0eda267 commit 8a39eb4

File tree

4 files changed

+42
-0
lines changed

4 files changed

+42
-0
lines changed

flock.go

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,3 +125,11 @@ func (f *Flock) setFh() error {
125125
f.fh = fh
126126
return nil
127127
}
128+
129+
// ensure the file handle is closed if no lock is held
130+
func (f *Flock) ensureFhState() {
131+
if !f.l && !f.r && f.fh != nil {
132+
f.fh.Close()
133+
f.fh = nil
134+
}
135+
}

flock_internal_test.go

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
package flock
2+
3+
import (
4+
"io/ioutil"
5+
"os"
6+
"testing"
7+
)
8+
9+
func Test(t *testing.T) {
10+
tmpFileFh, err := ioutil.TempFile(os.TempDir(), "go-flock-")
11+
tmpFileFh.Close()
12+
tmpFile := tmpFileFh.Name()
13+
os.Remove(tmpFile)
14+
15+
lock := New(tmpFile)
16+
locked, err := lock.TryLock()
17+
if locked == false || err != nil {
18+
t.Fatalf("failed to lock: locked: %t, err: %v", locked, err)
19+
}
20+
21+
newLock := New(tmpFile)
22+
locked, err = newLock.TryLock()
23+
if locked != false || err != nil {
24+
t.Fatalf("should have failed locking: locked: %t, err: %v", locked, err)
25+
}
26+
27+
if newLock.fh != nil {
28+
t.Fatal("file handle should have been released and be nil")
29+
}
30+
}

flock_unix.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,7 @@ func (f *Flock) lock(locked *bool, flag int) error {
5151
if err := f.setFh(); err != nil {
5252
return err
5353
}
54+
defer f.ensureFhState()
5455
}
5556

5657
if err := syscall.Flock(int(f.fh.Fd()), flag); err != nil {
@@ -142,6 +143,7 @@ func (f *Flock) try(locked *bool, flag int) (bool, error) {
142143
if err := f.setFh(); err != nil {
143144
return false, err
144145
}
146+
defer f.ensureFhState()
145147
}
146148

147149
var retried bool

flock_windows.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@ func (f *Flock) lock(locked *bool, flag uint32) error {
4646
if err := f.setFh(); err != nil {
4747
return err
4848
}
49+
defer f.ensureFhState()
4950
}
5051

5152
if _, errNo := lockFileEx(syscall.Handle(f.fh.Fd()), flag, 0, 1, 0, &syscall.Overlapped{}); errNo > 0 {
@@ -122,6 +123,7 @@ func (f *Flock) try(locked *bool, flag uint32) (bool, error) {
122123
if err := f.setFh(); err != nil {
123124
return false, err
124125
}
126+
defer f.ensureFhState()
125127
}
126128

127129
_, errNo := lockFileEx(syscall.Handle(f.fh.Fd()), flag|winLockfileFailImmediately, 0, 1, 0, &syscall.Overlapped{})

0 commit comments

Comments
 (0)