mirror of
https://github.com/ncruces/go-sqlite3.git
synced 2026-01-11 21:49:13 +00:00
Issue #330.
This commit is contained in:
@@ -1,12 +1,10 @@
|
|||||||
package util
|
package util
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"context"
|
|
||||||
"os"
|
"os"
|
||||||
"reflect"
|
"reflect"
|
||||||
"unsafe"
|
"unsafe"
|
||||||
|
|
||||||
"github.com/tetratelabs/wazero/api"
|
|
||||||
"golang.org/x/sys/windows"
|
"golang.org/x/sys/windows"
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -16,14 +14,21 @@ type MappedRegion struct {
|
|||||||
addr uintptr
|
addr uintptr
|
||||||
}
|
}
|
||||||
|
|
||||||
func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, size int32) (*MappedRegion, error) {
|
func MapRegion(f *os.File, offset int64, size int32) (*MappedRegion, error) {
|
||||||
h, err := windows.CreateFileMapping(windows.Handle(f.Fd()), nil, windows.PAGE_READWRITE, 0, 0, nil)
|
maxSize := offset + int64(size)
|
||||||
|
h, err := windows.CreateFileMapping(
|
||||||
|
windows.Handle(f.Fd()), nil, windows.PAGE_READWRITE,
|
||||||
|
uint32(maxSize>>32), uint32(maxSize), nil)
|
||||||
if h == 0 {
|
if h == 0 {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const allocationGranularity = 64 * 1024
|
||||||
|
align := offset % allocationGranularity
|
||||||
|
offset -= align
|
||||||
|
|
||||||
a, err := windows.MapViewOfFile(h, windows.FILE_MAP_WRITE,
|
a, err := windows.MapViewOfFile(h, windows.FILE_MAP_WRITE,
|
||||||
uint32(offset>>32), uint32(offset), uintptr(size))
|
uint32(offset>>32), uint32(offset), uintptr(size)+uintptr(align))
|
||||||
if a == 0 {
|
if a == 0 {
|
||||||
windows.CloseHandle(h)
|
windows.CloseHandle(h)
|
||||||
return nil, err
|
return nil, err
|
||||||
@@ -32,9 +37,9 @@ func MapRegion(ctx context.Context, mod api.Module, f *os.File, offset int64, si
|
|||||||
ret := &MappedRegion{Handle: h, addr: a}
|
ret := &MappedRegion{Handle: h, addr: a}
|
||||||
// SliceHeader, although deprecated, avoids a go vet warning.
|
// SliceHeader, although deprecated, avoids a go vet warning.
|
||||||
sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data))
|
sh := (*reflect.SliceHeader)(unsafe.Pointer(&ret.Data))
|
||||||
|
sh.Data = a + uintptr(align)
|
||||||
sh.Len = int(size)
|
sh.Len = int(size)
|
||||||
sh.Cap = int(size)
|
sh.Cap = int(size)
|
||||||
sh.Data = a
|
|
||||||
return ret, nil
|
return ret, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -98,7 +98,7 @@ func (s *vfsShm) shmMap(ctx context.Context, mod api.Module, id, size int32, ext
|
|||||||
|
|
||||||
// Maps regions into memory.
|
// Maps regions into memory.
|
||||||
for int(id) >= len(s.shared) {
|
for int(id) >= len(s.shared) {
|
||||||
r, err := util.MapRegion(ctx, mod, s.File, int64(id)*int64(size), size)
|
r, err := util.MapRegion(s.File, int64(id)*int64(size), size)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, err
|
return 0, err
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -470,6 +470,8 @@ func vfsErrorCode(ctx context.Context, err error, code _ErrorCode) _ErrorCode {
|
|||||||
switch v := reflect.ValueOf(err); v.Kind() {
|
switch v := reflect.ValueOf(err); v.Kind() {
|
||||||
case reflect.Uint8, reflect.Uint16:
|
case reflect.Uint8, reflect.Uint16:
|
||||||
code = _ErrorCode(v.Uint())
|
code = _ErrorCode(v.Uint())
|
||||||
|
default:
|
||||||
|
sys = err
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user