Skip to content

Commit 728421a

Browse files
authored
Merge pull request #3285 from apostasie/dev-fix-lock
Make windows filelocking exclusive
2 parents 0108a22 + 732656a commit 728421a

File tree

1 file changed

+4
-6
lines changed

1 file changed

+4
-6
lines changed

pkg/lockutil/lockutil_windows.go

Lines changed: 4 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -32,13 +32,12 @@ func WithDirLock(dir string, fn func() error) error {
3232
}
3333
defer dirFile.Close()
3434
// see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx
35-
// 1 lock immediately
36-
if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), 1, 0, 1, 0, &windows.Overlapped{}); err != nil {
35+
if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), windows.LOCKFILE_EXCLUSIVE_LOCK, 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)); err != nil {
3736
return fmt.Errorf("failed to lock %q: %w", dir, err)
3837
}
3938

4039
defer func() {
41-
if err := windows.UnlockFileEx(windows.Handle(dirFile.Fd()), 0, 1, 0, &windows.Overlapped{}); err != nil {
40+
if err := windows.UnlockFileEx(windows.Handle(dirFile.Fd()), 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)); err != nil {
4241
log.L.WithError(err).Errorf("failed to unlock %q", dir)
4342
}
4443
}()
@@ -51,8 +50,7 @@ func Lock(dir string) (*os.File, error) {
5150
return nil, err
5251
}
5352
// see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx
54-
// 1 lock immediately
55-
if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), 1, 0, 1, 0, &windows.Overlapped{}); err != nil {
53+
if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), windows.LOCKFILE_EXCLUSIVE_LOCK, 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)); err != nil {
5654
return nil, fmt.Errorf("failed to lock %q: %w", dir, err)
5755
}
5856
return dirFile, nil
@@ -63,5 +61,5 @@ func Unlock(locked *os.File) error {
6361
_ = locked.Close()
6462
}()
6563

66-
return windows.UnlockFileEx(windows.Handle(locked.Fd()), 0, 1, 0, &windows.Overlapped{})
64+
return windows.UnlockFileEx(windows.Handle(locked.Fd()), 0, ^uint32(0), ^uint32(0), new(windows.Overlapped))
6765
}

0 commit comments

Comments
 (0)