diff options
Diffstat (limited to 'vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go')
| -rw-r--r-- | vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go | 50 |
1 files changed, 28 insertions, 22 deletions
diff --git a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go index 0be523ad6..ad3e153ae 100644 --- a/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go +++ b/vendor/github.com/ncruces/go-sqlite3/vfs/shm_windows.go @@ -40,32 +40,33 @@ func (s *vfsShm) Close() error { return s.File.Close() } -func (s *vfsShm) shmOpen() _ErrorCode { +func (s *vfsShm) shmOpen() error { + if s.fileLock { + return nil + } if s.File == nil { f, err := os.OpenFile(s.path, os.O_RDWR|os.O_CREATE, 0666) if err != nil { - return _CANTOPEN + return sysError{err, _CANTOPEN} } + s.fileLock = false s.File = f } - if s.fileLock { - return _OK - } // Dead man's switch. - if rc := osWriteLock(s.File, _SHM_DMS, 1, 0); rc == _OK { + if osWriteLock(s.File, _SHM_DMS, 1, 0) == nil { err := s.Truncate(0) osUnlock(s.File, _SHM_DMS, 1) if err != nil { - return _IOERR_SHMOPEN + return sysError{err, _IOERR_SHMOPEN} } } - rc := osReadLock(s.File, _SHM_DMS, 1, 0) - s.fileLock = rc == _OK - return rc + err := osReadLock(s.File, _SHM_DMS, 1, 0) + s.fileLock = err == nil + return err } -func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (_ ptr_t, rc _ErrorCode) { +func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, extend bool) (_ ptr_t, err error) { // Ensure size is a multiple of the OS page size. if size != _WALINDEX_PGSZ || (windows.Getpagesize()-1)&_WALINDEX_PGSZ != 0 { return 0, _IOERR_SHMMAP @@ -75,23 +76,23 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext s.free = mod.ExportedFunction("sqlite3_free") s.alloc = mod.ExportedFunction("sqlite3_malloc64") } - if rc := s.shmOpen(); rc != _OK { - return 0, rc + if err := s.shmOpen(); err != nil { + return 0, err } - defer s.shmAcquire(&rc) + defer s.shmAcquire(&err) // Check if file is big enough. o, err := s.Seek(0, io.SeekEnd) if err != nil { - return 0, _IOERR_SHMSIZE + return 0, sysError{err, _IOERR_SHMSIZE} } if n := (int64(id) + 1) * int64(size); n > o { if !extend { - return 0, _OK + return 0, nil } - if osAllocate(s.File, n) != nil { - return 0, _IOERR_SHMSIZE + if err := osAllocate(s.File, n); err != nil { + return 0, sysError{err, _IOERR_SHMSIZE} } } @@ -99,7 +100,7 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext for int(id) >= len(s.shared) { r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size) if err != nil { - return 0, _IOERR_SHMMAP + return 0, err } s.regions = append(s.regions, r) s.shared = append(s.shared, r.Data) @@ -124,13 +125,17 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext } s.shadow[0][4] = 1 - return s.ptrs[id], _OK + return s.ptrs[id], nil } -func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) (rc _ErrorCode) { +func (s *vfsShm) shmLock(offset, n int32, flags _ShmFlag) (err error) { + if s.File == nil { + return _IOERR_SHMLOCK + } + switch { case flags&_SHM_LOCK != 0: - defer s.shmAcquire(&rc) + defer s.shmAcquire(&err) case flags&_SHM_EXCLUSIVE != 0: s.shmRelease() } @@ -168,6 +173,7 @@ func (s *vfsShm) shmUnmap(delete bool) { // Close the file. s.Close() s.File = nil + s.fileLock = false if delete { os.Remove(s.path) } |
