diff options
author | 2025-03-09 17:47:56 +0100 | |
---|---|---|
committer | 2025-03-10 01:59:49 +0100 | |
commit | 3ac1ee16f377d31a0fb80c8dae28b6239ac4229e (patch) | |
tree | f61faa581feaaeaba2542b9f2b8234a590684413 /vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go | |
parent | [chore] update URLs to forked source (diff) | |
download | gotosocial-3ac1ee16f377d31a0fb80c8dae28b6239ac4229e.tar.xz |
[chore] remove vendor
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go')
-rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go | 195 |
1 files changed, 0 insertions, 195 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go deleted file mode 100644 index 0398f4760..000000000 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_windows.go +++ /dev/null @@ -1,195 +0,0 @@ -//go:build !sqlite3_dotlk - -package vfs - -import ( - "os" - "time" - - "golang.org/x/sys/windows" -) - -func osGetSharedLock(file *os.File) _ErrorCode { - // Acquire the PENDING lock temporarily before acquiring a new SHARED lock. - rc := osReadLock(file, _PENDING_BYTE, 1, 0) - if rc == _OK { - // Acquire the SHARED lock. - rc = osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) - - // Release the PENDING lock. - osUnlock(file, _PENDING_BYTE, 1) - } - return rc -} - -func osGetReservedLock(file *os.File) _ErrorCode { - // Acquire the RESERVED lock. - return osWriteLock(file, _RESERVED_BYTE, 1, 0) -} - -func osGetExclusiveLock(file *os.File, state *LockLevel) _ErrorCode { - // A PENDING lock is needed before releasing the SHARED lock. - if *state < LOCK_PENDING { - // If we were RESERVED, we can block indefinitely. - var timeout time.Duration - if *state == LOCK_RESERVED { - timeout = -1 - } - if rc := osWriteLock(file, _PENDING_BYTE, 1, timeout); rc != _OK { - return rc - } - *state = LOCK_PENDING - } - - // Release the SHARED lock. - osUnlock(file, _SHARED_FIRST, _SHARED_SIZE) - - // Acquire the EXCLUSIVE lock. - // Can't wait here, because the file is not OVERLAPPED. - rc := osWriteLock(file, _SHARED_FIRST, _SHARED_SIZE, 0) - - if rc != _OK { - // Reacquire the SHARED lock. - if rc := osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0); rc != _OK { - // notest // this should never happen - return _IOERR_RDLOCK - } - } - return rc -} - -func osDowngradeLock(file *os.File, state LockLevel) _ErrorCode { - if state >= LOCK_EXCLUSIVE { - // Release the EXCLUSIVE lock while holding the PENDING lock. - osUnlock(file, _SHARED_FIRST, _SHARED_SIZE) - - // Reacquire the SHARED lock. - if rc := osReadLock(file, _SHARED_FIRST, _SHARED_SIZE, 0); rc != _OK { - // notest // this should never happen - return _IOERR_RDLOCK - } - } - - // Release the PENDING and RESERVED locks. - if state >= LOCK_RESERVED { - osUnlock(file, _RESERVED_BYTE, 1) - } - if state >= LOCK_PENDING { - osUnlock(file, _PENDING_BYTE, 1) - } - return _OK -} - -func osReleaseLock(file *os.File, state LockLevel) _ErrorCode { - // Release all locks, PENDING must be last. - if state >= LOCK_RESERVED { - osUnlock(file, _RESERVED_BYTE, 1) - } - if state >= LOCK_SHARED { - osUnlock(file, _SHARED_FIRST, _SHARED_SIZE) - } - if state >= LOCK_PENDING { - osUnlock(file, _PENDING_BYTE, 1) - } - return _OK -} - -func osCheckReservedLock(file *os.File) (bool, _ErrorCode) { - // Test the RESERVED lock. - rc := osLock(file, 0, _RESERVED_BYTE, 1, 0, _IOERR_CHECKRESERVEDLOCK) - if rc == _BUSY { - return true, _OK - } - if rc == _OK { - // Release the RESERVED lock. - osUnlock(file, _RESERVED_BYTE, 1) - } - return false, rc -} - -func osReadLock(file *os.File, start, len uint32, timeout time.Duration) _ErrorCode { - return osLock(file, 0, start, len, timeout, _IOERR_RDLOCK) -} - -func osWriteLock(file *os.File, start, len uint32, timeout time.Duration) _ErrorCode { - return osLock(file, windows.LOCKFILE_EXCLUSIVE_LOCK, start, len, timeout, _IOERR_LOCK) -} - -func osLock(file *os.File, flags, start, len uint32, timeout time.Duration, def _ErrorCode) _ErrorCode { - var err error - switch { - case timeout == 0: - err = osLockEx(file, flags|windows.LOCKFILE_FAIL_IMMEDIATELY, start, len) - case timeout < 0: - err = osLockEx(file, flags, start, len) - default: - err = osLockExTimeout(file, flags, start, len, timeout) - } - return osLockErrorCode(err, def) -} - -func osUnlock(file *os.File, start, len uint32) _ErrorCode { - err := windows.UnlockFileEx(windows.Handle(file.Fd()), - 0, len, 0, &windows.Overlapped{Offset: start}) - if err == windows.ERROR_NOT_LOCKED { - return _OK - } - if err != nil { - return _IOERR_UNLOCK - } - return _OK -} - -func osLockEx(file *os.File, flags, start, len uint32) error { - return windows.LockFileEx(windows.Handle(file.Fd()), flags, - 0, len, 0, &windows.Overlapped{Offset: start}) -} - -func osLockExTimeout(file *os.File, flags, start, len uint32, timeout time.Duration) error { - event, err := windows.CreateEvent(nil, 1, 0, nil) - if err != nil { - return err - } - defer windows.CloseHandle(event) - - fd := windows.Handle(file.Fd()) - overlapped := &windows.Overlapped{ - Offset: start, - HEvent: event, - } - - err = windows.LockFileEx(fd, flags, 0, len, 0, overlapped) - if err != windows.ERROR_IO_PENDING { - return err - } - - ms := (timeout + time.Millisecond - 1) / time.Millisecond - rc, err := windows.WaitForSingleObject(event, uint32(ms)) - if rc == windows.WAIT_OBJECT_0 { - return nil - } - defer windows.CancelIoEx(fd, overlapped) - - if err != nil { - return err - } - return windows.Errno(rc) -} - -func osLockErrorCode(err error, def _ErrorCode) _ErrorCode { - if err == nil { - return _OK - } - if errno, ok := err.(windows.Errno); ok { - // https://devblogs.microsoft.com/oldnewthing/20140905-00/?p=63 - switch errno { - case - windows.ERROR_LOCK_VIOLATION, - windows.ERROR_OPERATION_ABORTED, - windows.ERROR_IO_PENDING, - windows.WAIT_TIMEOUT: - return _BUSY - } - } - return def -} |