diff options
author | 2024-11-07 00:16:28 +0000 | |
---|---|---|
committer | 2024-11-07 00:16:28 +0000 | |
commit | 45e1609377631070765065ffb35ed7d29e8e81f1 (patch) | |
tree | 51d170ff0d5fab1ab0f8b1b79c9dd8c31d4ce5b9 /vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go | |
parent | [chore] update go ffmpreg to v0.6.0 (#3515) (diff) | |
download | gotosocial-45e1609377631070765065ffb35ed7d29e8e81f1.tar.xz |
bump ncruces/go-sqlite3 to v0.20.2 (#3524)
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go')
-rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go | 97 |
1 files changed, 25 insertions, 72 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go index 8dc6ec922..d4e046369 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_bsd.go @@ -1,4 +1,4 @@ -//go:build (freebsd || openbsd || netbsd || dragonfly || illumos || sqlite3_flock) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_noshm || sqlite3_nosys) +//go:build ((freebsd || openbsd || netbsd || dragonfly || illumos) && (386 || arm || amd64 || arm64 || riscv64 || ppc64le) && !(sqlite3_dotlk || sqlite3_nosys)) || sqlite3_flock package vfs @@ -14,44 +14,14 @@ import ( "github.com/ncruces/go-sqlite3/internal/util" ) -// SupportsSharedMemory is false on platforms that do not support shared memory. -// To use [WAL without shared-memory], you need to set [EXCLUSIVE locking mode]. -// -// [WAL without shared-memory]: https://sqlite.org/wal.html#noshm -// [EXCLUSIVE locking mode]: https://sqlite.org/pragma.html#pragma_locking_mode -const SupportsSharedMemory = true - -const _SHM_NLOCK = 8 - -func (f *vfsFile) SharedMemory() SharedMemory { return f.shm } - -// NewSharedMemory returns a shared-memory WAL-index -// backed by a file with the given path. -// It will return nil if shared-memory is not supported, -// or not appropriate for the given flags. -// Only [OPEN_MAIN_DB] databases may need a WAL-index. -// You must ensure all concurrent accesses to a database -// use shared-memory instances created with the same path. -func NewSharedMemory(path string, flags OpenFlag) SharedMemory { - if flags&OPEN_MAIN_DB == 0 || flags&(OPEN_DELETEONCLOSE|OPEN_MEMORY) != 0 { - return nil - } - return &vfsShm{ - path: path, - readOnly: flags&OPEN_READONLY != 0, - } -} - type vfsShmFile struct { *os.File info os.FileInfo - // +checklocks:vfsShmFilesMtx - refs int + refs int // +checklocks:vfsShmFilesMtx - // +checklocks:lockMtx - lock [_SHM_NLOCK]int16 - lockMtx sync.Mutex + lock [_SHM_NLOCK]int16 // +checklocks:Mutex + sync.Mutex } var ( @@ -62,10 +32,9 @@ var ( type vfsShm struct { *vfsShmFile - path string - lock [_SHM_NLOCK]bool - regions []*util.MappedRegion - readOnly bool + path string + lock [_SHM_NLOCK]bool + regions []*util.MappedRegion } func (s *vfsShm) Close() error { @@ -80,7 +49,7 @@ func (s *vfsShm) Close() error { s.shmLock(0, _SHM_NLOCK, _SHM_UNLOCK) // Decrease reference count. - if s.vfsShmFile.refs > 1 { + if s.vfsShmFile.refs > 0 { s.vfsShmFile.refs-- s.vfsShmFile = nil return nil @@ -97,7 +66,7 @@ func (s *vfsShm) Close() error { panic(util.AssertErr()) } -func (s *vfsShm) shmOpen() (rc _ErrorCode) { +func (s *vfsShm) shmOpen() _ErrorCode { if s.vfsShmFile != nil { return _OK } @@ -128,34 +97,29 @@ func (s *vfsShm) shmOpen() (rc _ErrorCode) { } } - // Lock and truncate the file, if not readonly. + // Lock and truncate the file. // The lock is only released by closing the file. - if s.readOnly { - rc = _READONLY_CANTINIT - } else { - if rc := osLock(f, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK); rc != _OK { - return rc - } - if err := f.Truncate(0); err != nil { - return _IOERR_SHMOPEN - } + if rc := osLock(f, unix.LOCK_EX|unix.LOCK_NB, _IOERR_LOCK); rc != _OK { + return rc + } + if err := f.Truncate(0); err != nil { + return _IOERR_SHMOPEN } // Add the new shared file. s.vfsShmFile = &vfsShmFile{ File: f, info: fi, - refs: 1, } f = nil // Don't close the file. for i, g := range vfsShmFiles { if g == nil { vfsShmFiles[i] = s.vfsShmFile - return rc + return _OK } } vfsShmFiles = append(vfsShmFiles, s.vfsShmFile) - return rc + return _OK } func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (uint32, _ErrorCode) { @@ -177,32 +141,22 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext if !extend { return 0, _OK } - err := osAllocate(s.File, n) - if err != nil { + if osAllocate(s.File, n) != nil { return 0, _IOERR_SHMSIZE } } - var prot int - if s.readOnly { - prot = unix.PROT_READ - } else { - prot = unix.PROT_READ | unix.PROT_WRITE - } - r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, prot) + r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size, false) if err != nil { return 0, _IOERR_SHMMAP } s.regions = append(s.regions, r) - if s.readOnly { - return r.Ptr, _READONLY - } return r.Ptr, _OK } func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { - s.lockMtx.Lock() - defer s.lockMtx.Unlock() + s.Lock() + defer s.Unlock() switch { case flags&_SHM_UNLOCK != 0: @@ -224,7 +178,7 @@ func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) _ErrorCode { if s.lock[i] { panic(util.AssertErr()) } - if s.vfsShmFile.lock[i] < 0 { + if s.vfsShmFile.lock[i]+1 <= 0 { return _BUSY } } @@ -261,8 +215,7 @@ func (s *vfsShm) shmUnmap(delete bool) { for _, r := range s.regions { r.Unmap() } - clear(s.regions) - s.regions = s.regions[:0] + s.regions = nil // Close the file. if delete { @@ -272,7 +225,7 @@ func (s *vfsShm) shmUnmap(delete bool) { } func (s *vfsShm) shmBarrier() { - s.lockMtx.Lock() + s.Lock() //lint:ignore SA2001 memory barrier. - s.lockMtx.Unlock() + s.Unlock() } |