mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-12 05:59:14 +00:00
Lock tweaks.
This commit is contained in:
@@ -223,7 +223,7 @@ func (m *memFile) Lock(lock vfs.LockLevel) error {
|
||||
m.reserved = true
|
||||
|
||||
case vfs.LOCK_EXCLUSIVE:
|
||||
if m.lock < vfs.LOCK_PENDING {
|
||||
if m.lock == vfs.LOCK_RESERVED {
|
||||
m.lock = vfs.LOCK_PENDING
|
||||
m.pending = true
|
||||
}
|
||||
|
||||
@@ -252,9 +252,8 @@ func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
||||
}
|
||||
defer time.AfterFunc(time.Millisecond, m.waiter.Broadcast).Stop()
|
||||
for m.owner != nil {
|
||||
// Our snapshot is invalid.
|
||||
if m.data != nil && m.data != m.mvccDB.data {
|
||||
return sqlite3.BUSY_SNAPSHOT
|
||||
return sqlite3.BUSY_SNAPSHOT // Our snapshot is invalid.
|
||||
}
|
||||
if time.Since(before) > time.Millisecond {
|
||||
return sqlite3.BUSY
|
||||
@@ -266,17 +265,16 @@ func (m *mvccFile) Lock(lock vfs.LockLevel) error {
|
||||
case m.data == nil:
|
||||
m.data = m.mvccDB.data
|
||||
case m.data != m.mvccDB.data:
|
||||
// Our snapshot is invalid.
|
||||
return sqlite3.BUSY_SNAPSHOT
|
||||
return sqlite3.BUSY_SNAPSHOT // Our snapshot is invalid.
|
||||
}
|
||||
// Take ownership.
|
||||
m.wrflag = false
|
||||
m.lock = lock
|
||||
m.owner = m
|
||||
return nil
|
||||
}
|
||||
|
||||
func (m *mvccFile) Unlock(lock vfs.LockLevel) error {
|
||||
m.wrflag = false // SQLite calls unlock even if locking is unsuccessful.
|
||||
if m.lock <= lock {
|
||||
return nil
|
||||
}
|
||||
@@ -287,7 +285,9 @@ func (m *mvccFile) Unlock(lock vfs.LockLevel) error {
|
||||
// Relase ownership, commit changes.
|
||||
if m.owner == m {
|
||||
m.owner = nil
|
||||
m.mvccDB.data = m.data
|
||||
if m.lock == vfs.LOCK_EXCLUSIVE {
|
||||
m.mvccDB.data = m.data
|
||||
}
|
||||
if m.waiter != nil {
|
||||
m.waiter.Broadcast()
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user