diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs')
| -rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go | 31 |
1 files changed, 18 insertions, 13 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go index 94347f1cc..b99070496 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/memdb/memdb.go @@ -2,7 +2,6 @@ package memdb import ( "io" - "runtime" "sync" "time" @@ -85,9 +84,10 @@ type memDB struct { // +checklocks:memoryMtx refs int32 - shared int32 // +checklocks:lockMtx - pending bool // +checklocks:lockMtx - reserved bool // +checklocks:lockMtx + shared int32 // +checklocks:lockMtx + pending bool // +checklocks:lockMtx + reserved bool // +checklocks:lockMtx + waiter *sync.Cond // +checklocks:lockMtx lockMtx sync.Mutex dataMtx sync.RWMutex @@ -195,8 +195,6 @@ func (m *memFile) Size() (int64, error) { return m.size, nil } -const spinWait = 25 * time.Microsecond - func (m *memFile) Lock(lock vfs.LockLevel) error { if m.lock >= lock { return nil @@ -228,13 +226,18 @@ func (m *memFile) Lock(lock vfs.LockLevel) error { m.pending = true } - for before := time.Now(); m.shared > 1; { - if time.Since(before) > spinWait { - return sqlite3.BUSY + if m.shared > 1 { + before := time.Now() + if m.waiter == nil { + m.waiter = sync.NewCond(&m.lockMtx) + } + defer time.AfterFunc(time.Millisecond, m.waiter.Broadcast).Stop() + for m.shared > 1 { + if time.Since(before) > time.Millisecond { + return sqlite3.BUSY + } + m.waiter.Wait() } - m.lockMtx.Unlock() - runtime.Gosched() - m.lockMtx.Lock() } } @@ -257,7 +260,9 @@ func (m *memFile) Unlock(lock vfs.LockLevel) error { m.pending = false } if lock < vfs.LOCK_SHARED { - m.shared-- + if m.shared--; m.pending && m.shared <= 1 && m.waiter != nil { + m.waiter.Broadcast() + } } m.lock = lock return nil |
