Skip to content

Commit d1075f7

Browse files
committed
Fix #87.
1 parent ed932ee commit d1075f7

File tree

3 files changed

+30
-8
lines changed

3 files changed

+30
-8
lines changed

tests/parallel/parallel_test.go

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,8 @@ func Test_memdb(t *testing.T) {
6161
iter = 5000
6262
}
6363

64+
memdb.Delete("test.db")
65+
memdb.Create("test.db", nil)
6466
name := "file:/test.db?vfs=memdb"
6567
testParallel(t, name, iter)
6668
testIntegrity(t, name)
@@ -145,6 +147,7 @@ func Benchmark_memdb(b *testing.B) {
145147
b.ResetTimer()
146148

147149
memdb.Delete("test.db")
150+
memdb.Create("test.db", nil)
148151
name := "file:/test.db?vfs=memdb"
149152
testParallel(b, name, b.N)
150153
}

vfs/memdb/api.go

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,11 @@ func Create(name string, data []byte) {
3333
memoryMtx.Lock()
3434
defer memoryMtx.Unlock()
3535

36-
db := new(memDB)
37-
db.size = int64(len(data))
36+
db := &memDB{
37+
refs: 1,
38+
name: name,
39+
size: int64(len(data)),
40+
}
3841

3942
// Convert data from WAL to rollback journal.
4043
if len(data) >= 20 && data[18] == 2 && data[19] == 2 {

vfs/memdb/memdb.go

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,6 @@ package memdb
33
import (
44
"io"
55
"runtime"
6-
"strings"
76
"sync"
87
"time"
98

@@ -34,22 +33,25 @@ func (memVFS) Open(name string, flags vfs.OpenFlag) (vfs.File, vfs.OpenFlag, err
3433
return nil, flags, sqlite3.CANTOPEN
3534
}
3635

37-
var db *memDB
36+
// A shared database has a name that begins with "/".
37+
shared := len(name) > 1 && name[0] == '/'
3838

39-
shared := strings.HasPrefix(name, "/")
39+
var db *memDB
4040
if shared {
41+
name = name[1:]
4142
memoryMtx.Lock()
4243
defer memoryMtx.Unlock()
43-
db = memoryDBs[name[1:]]
44+
db = memoryDBs[name]
4445
}
4546
if db == nil {
4647
if flags&vfs.OPEN_CREATE == 0 {
4748
return nil, flags, sqlite3.CANTOPEN
4849
}
49-
db = new(memDB)
50+
db = &memDB{name: name}
5051
}
5152
if shared {
52-
memoryDBs[name[1:]] = db // +checklocksignore: lock is held
53+
db.refs++ // +checklocksforce: memoryMtx is held
54+
memoryDBs[name] = db
5355
}
5456

5557
return &memFile{
@@ -71,6 +73,8 @@ func (memVFS) FullPathname(name string) (string, error) {
7173
}
7274

7375
type memDB struct {
76+
name string
77+
7478
// +checklocks:lockMtx
7579
pending *memFile
7680
// +checklocks:lockMtx
@@ -85,10 +89,21 @@ type memDB struct {
8589
// +checklocks:lockMtx
8690
shared int
8791

92+
// +checklocks:memoryMtx
93+
refs int
94+
8895
lockMtx sync.Mutex
8996
dataMtx sync.RWMutex
9097
}
9198

99+
func (m *memDB) release() {
100+
memoryMtx.Lock()
101+
defer memoryMtx.Unlock()
102+
if m.refs--; m.refs == 0 && m == memoryDBs[m.name] {
103+
delete(memoryDBs, m.name)
104+
}
105+
}
106+
92107
type memFile struct {
93108
*memDB
94109
lock vfs.LockLevel
@@ -102,6 +117,7 @@ var (
102117
)
103118

104119
func (m *memFile) Close() error {
120+
m.release()
105121
return m.Unlock(vfs.LOCK_NONE)
106122
}
107123

0 commit comments

Comments
 (0)