From 732656adb7ac561e2c3f46ea60870f6e9a1cd09c Mon Sep 17 00:00:00 2001 From: apostasie Date: Thu, 8 Aug 2024 17:36:35 -0700 Subject: [PATCH] Make windows filelocking exclusive Signed-off-by: apostasie --- pkg/lockutil/lockutil_windows.go | 10 ++++------ 1 file changed, 4 insertions(+), 6 deletions(-) diff --git a/pkg/lockutil/lockutil_windows.go b/pkg/lockutil/lockutil_windows.go index a269fc65716..7763c92597a 100644 --- a/pkg/lockutil/lockutil_windows.go +++ b/pkg/lockutil/lockutil_windows.go @@ -31,13 +31,12 @@ func WithDirLock(dir string, fn func() error) error { } defer dirFile.Close() // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx - // 1 lock immediately - if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), 1, 0, 1, 0, &windows.Overlapped{}); err != nil { + if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), windows.LOCKFILE_EXCLUSIVE_LOCK, 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)); err != nil { return fmt.Errorf("failed to lock %q: %w", dir, err) } defer func() { - if err := windows.UnlockFileEx(windows.Handle(dirFile.Fd()), 0, 1, 0, &windows.Overlapped{}); err != nil { + if err := windows.UnlockFileEx(windows.Handle(dirFile.Fd()), 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)); err != nil { log.L.WithError(err).Errorf("failed to unlock %q", dir) } }() @@ -50,8 +49,7 @@ func Lock(dir string) (*os.File, error) { return nil, err } // see https://msdn.microsoft.com/en-us/library/windows/desktop/aa365203(v=vs.85).aspx - // 1 lock immediately - if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), 1, 0, 1, 0, &windows.Overlapped{}); err != nil { + if err = windows.LockFileEx(windows.Handle(dirFile.Fd()), windows.LOCKFILE_EXCLUSIVE_LOCK, 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)); err != nil { return nil, fmt.Errorf("failed to lock %q: %w", dir, err) } return dirFile, nil @@ -62,5 +60,5 @@ func Unlock(locked *os.File) error { _ = locked.Close() }() - return windows.UnlockFileEx(windows.Handle(locked.Fd()), 0, 1, 0, &windows.Overlapped{}) + return windows.UnlockFileEx(windows.Handle(locked.Fd()), 0, ^uint32(0), ^uint32(0), new(windows.Overlapped)) }