From bef46e795448470041493d4f80e86d1342ba3923 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Thu, 23 Mar 2023 12:40:55 +0000 Subject: [PATCH] Locking improvements (windows). --- vfs_lock.go | 14 -------------- vfs_os_unix.go | 9 +++++++++ vfs_os_windows.go | 16 +++++++++++++++- 3 files changed, 24 insertions(+), 15 deletions(-) diff --git a/vfs_lock.go b/vfs_lock.go index 2213224..a67cb92 100644 --- a/vfs_lock.go +++ b/vfs_lock.go @@ -89,10 +89,6 @@ func vfsLock(ctx context.Context, mod api.Module, pFile uint32, eLock vfsLockSta if cLock != _NO_LOCK { panic(assertErr()) } - // Test the PENDING lock before acquiring a new SHARED lock. - if locked, _ := vfsOS.CheckPendingLock(file); locked { - return uint32(BUSY) - } if rc := vfsOS.GetSharedLock(file, timeout); rc != _OK { return uint32(rc) } @@ -195,11 +191,6 @@ func vfsCheckReservedLock(ctx context.Context, mod api.Module, pFile, pResOut ui return uint32(rc) } -func (vfsOSMethods) GetSharedLock(file *os.File, timeout time.Duration) xErrorCode { - // Acquire the SHARED lock. - return vfsOS.readLock(file, _SHARED_FIRST, _SHARED_SIZE, timeout) -} - func (vfsOSMethods) GetReservedLock(file *os.File, timeout time.Duration) xErrorCode { // Acquire the RESERVED lock. return vfsOS.writeLock(file, _RESERVED_BYTE, 1, timeout) @@ -214,8 +205,3 @@ func (vfsOSMethods) CheckReservedLock(file *os.File) (bool, xErrorCode) { // Test the RESERVED lock. return vfsOS.checkLock(file, _RESERVED_BYTE, 1) } - -func (vfsOSMethods) CheckPendingLock(file *os.File) (bool, xErrorCode) { - // Test the PENDING lock. - return vfsOS.checkLock(file, _PENDING_BYTE, 1) -} diff --git a/vfs_os_unix.go b/vfs_os_unix.go index 4f76194..28860d9 100644 --- a/vfs_os_unix.go +++ b/vfs_os_unix.go @@ -25,6 +25,15 @@ func (vfsOSMethods) Access(path string, flags _AccessFlag) error { return unix.Access(path, access) } +func (vfsOSMethods) GetSharedLock(file *os.File, timeout time.Duration) xErrorCode { + // Test the PENDING lock before acquiring a new SHARED lock. + if pending, _ := vfsOS.checkLock(file, _PENDING_BYTE, 1); pending { + return xErrorCode(BUSY) + } + // Acquire the SHARED lock. + return vfsOS.readLock(file, _SHARED_FIRST, _SHARED_SIZE, timeout) +} + func (vfsOSMethods) GetExclusiveLock(file *os.File, timeout time.Duration) xErrorCode { if timeout == 0 { timeout = time.Millisecond diff --git a/vfs_os_windows.go b/vfs_os_windows.go index 75df4fd..457ee55 100644 --- a/vfs_os_windows.go +++ b/vfs_os_windows.go @@ -63,6 +63,20 @@ func (vfsOSMethods) Allocate(file *os.File, size int64) error { return file.Truncate(size) } +func (vfsOSMethods) GetSharedLock(file *os.File, timeout time.Duration) xErrorCode { + // Acquire the PENDING lock temporarily before acquiring a new SHARED lock. + rc := vfsOS.readLock(file, _PENDING_BYTE, 1, timeout) + + if rc == _OK { + // Acquire the SHARED lock. + rc = vfsOS.readLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) + + // Release the PENDING lock. + vfsOS.unlock(file, _PENDING_BYTE, 1) + } + return rc +} + func (vfsOSMethods) GetExclusiveLock(file *os.File, timeout time.Duration) xErrorCode { if timeout == 0 { timeout = time.Millisecond @@ -74,8 +88,8 @@ func (vfsOSMethods) GetExclusiveLock(file *os.File, timeout time.Duration) xErro // Acquire the EXCLUSIVE lock. rc := vfsOS.writeLock(file, _SHARED_FIRST, _SHARED_SIZE, timeout) - // Reacquire the SHARED lock. if rc != _OK { + // Reacquire the SHARED lock. vfsOS.readLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) } return rc