From 78473b4b37773f7ec4e79060b6d7d9f822e0a4b6 Mon Sep 17 00:00:00 2001 From: Nuno Cruces Date: Fri, 30 Aug 2024 01:27:57 +0100 Subject: [PATCH] Fix BSD locks. --- tests/parallel/parallel_test.go | 9 ++++++++- vfs/shm_bsd.go | 12 +++++++++++- 2 files changed, 19 insertions(+), 2 deletions(-) diff --git a/tests/parallel/parallel_test.go b/tests/parallel/parallel_test.go index d19565f..7ecbd2b 100644 --- a/tests/parallel/parallel_test.go +++ b/tests/parallel/parallel_test.go @@ -45,12 +45,19 @@ func Test_wal(t *testing.T) { t.Skip("skipping without shared memory") } + var iter int + if testing.Short() { + iter = 1000 + } else { + iter = 2500 + } + name := "file:" + filepath.ToSlash(filepath.Join(t.TempDir(), "test.db")) + "?_pragma=busy_timeout(10000)" + "&_pragma=journal_mode(wal)" + "&_pragma=synchronous(off)" - testParallel(t, name, 1000) + testParallel(t, name, iter) testIntegrity(t, name) } diff --git a/vfs/shm_bsd.go b/vfs/shm_bsd.go index 65674ed..0894011 100644 --- a/vfs/shm_bsd.go +++ b/vfs/shm_bsd.go @@ -121,8 +121,8 @@ func (s *vfsShm) shmOpen() (rc _ErrorCode) { // Find a shared file, increase the reference count. for _, g := range vfsShmFiles { if g != nil && os.SameFile(fi, g.info) { - g.refs++ s.vfsShmFile = g + g.refs++ return _OK } } @@ -207,15 +207,22 @@ func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { case flags&_SHM_UNLOCK != 0: for i := offset; i < offset+n; i++ { if s.lock[i] { + if s.vfsShmFile.lock[i] == 0 { + panic(util.AssertErr()) + } if s.vfsShmFile.lock[i] <= 0 { s.vfsShmFile.lock[i] = 0 } else { s.vfsShmFile.lock[i]-- } + s.lock[i] = false } } case flags&_SHM_SHARED != 0: for i := offset; i < offset+n; i++ { + if s.lock[i] { + panic(util.AssertErr()) + } if s.vfsShmFile.lock[i] < 0 { return _BUSY } @@ -226,6 +233,9 @@ func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { } case flags&_SHM_EXCLUSIVE != 0: for i := offset; i < offset+n; i++ { + if s.lock[i] { + panic(util.AssertErr()) + } if s.vfsShmFile.lock[i] != 0 { return _BUSY }