summaryrefslogtreecommitdiff
path: root/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go
diff options
context:
space:
mode:
authorLibravatar kim <89579420+NyaaaWhatsUpDoc@users.noreply.github.com>2024-11-26 16:25:48 +0000
committerLibravatar GitHub <noreply@github.com>2024-11-26 16:25:48 +0000
commit61f8f1e0e3236993f5522215f1900d35e49680c0 (patch)
treeb8bec737013b8213996a40ab913a810833ac5e4e /vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go
parent[bugfix] Allow unsetting filter expiration dates (#3560) (diff)
downloadgotosocial-61f8f1e0e3236993f5522215f1900d35e49680c0.tar.xz
pull in ncruces/go-sqlite3 v0.20.3 with tetratelabs/wazero v1.8.2 (#3574)
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go')
-rw-r--r--vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go25
1 files changed, 18 insertions, 7 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go
index 56713e359..cc5da7cab 100644
--- a/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go
+++ b/vendor/github.com/ncruces/go-sqlite3/vfs/os_bsd.go
@@ -15,9 +15,15 @@ func osGetSharedLock(file *os.File) _ErrorCode {
func osGetReservedLock(file *os.File) _ErrorCode {
rc := osLock(file, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK)
if rc == _BUSY {
- // The documentation states the lock is upgraded by releasing the previous lock,
- // then acquiring the new lock.
- // This is a race, so return BUSY_SNAPSHOT to ensure the transaction is aborted.
+ // The documentation states that a lock is upgraded by
+ // releasing the previous lock, then acquiring the new lock.
+ // Going over the source code of various BSDs, though,
+ // with LOCK_NB, the lock is not released,
+ // and EAGAIN is returned holding the shared lock.
+ // Still, if we're already in a transaction, we want to abort it,
+ // so return BUSY_SNAPSHOT here. If there's no transaction active,
+ // SQLite will change this back to SQLITE_BUSY,
+ // and invoke the busy handler if appropriate.
return _BUSY_SNAPSHOT
}
return rc
@@ -33,9 +39,11 @@ func osGetExclusiveLock(file *os.File, state *LockLevel) _ErrorCode {
func osDowngradeLock(file *os.File, _ LockLevel) _ErrorCode {
rc := osLock(file, unix.LOCK_SH|unix.LOCK_NB, _IOERR_RDLOCK)
if rc == _BUSY {
- // The documentation states the lock is upgraded by releasing the previous lock,
- // then acquiring the new lock.
- // This is a race, so return IOERR_RDLOCK to ensure the transaction is aborted.
+ // The documentation states that a lock is downgraded by
+ // releasing the previous lock then acquiring the new lock.
+ // Going over the source code of various BSDs, though,
+ // with LOCK_SH|LOCK_NB this should never happen.
+ // Return IOERR_RDLOCK, as BUSY would cause an assert to fail.
return _IOERR_RDLOCK
}
return _OK
@@ -50,7 +58,10 @@ func osReleaseLock(file *os.File, _ LockLevel) _ErrorCode {
}
func osCheckReservedLock(file *os.File) (bool, _ErrorCode) {
- // Test the RESERVED lock.
+ // Test the RESERVED lock with fcntl(F_GETLK).
+ // This only works on systems where fcntl and flock are compatible.
+ // However, SQLite only calls this while holding a shared lock,
+ // so the difference is immaterial.
lock, rc := osTestLock(file, _RESERVED_BYTE, 1)
return lock == unix.F_WRLCK, rc
}