From 1579e12011fbf6249c507f9acae6b610e2870a71 Mon Sep 17 00:00:00 2001 From: Fabian Reinartz Date: Tue, 4 Apr 2017 15:59:52 +0200 Subject: [PATCH] Add cross-platform mmap --- db_unix.go | 17 +++-------------- db_windows.go | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 37 insertions(+), 14 deletions(-) create mode 100644 db_windows.go diff --git a/db_unix.go b/db_unix.go index 2e673f951..814bee851 100644 --- a/db_unix.go +++ b/db_unix.go @@ -4,24 +4,13 @@ package tsdb import ( "os" - "unsafe" - - "golang.org/x/sys/unix" + "syscall" ) func mmap(f *os.File, length int) ([]byte, error) { - return unix.Mmap(int(f.Fd()), 0, length, unix.PROT_READ, unix.MAP_SHARED) + return syscall.Mmap(int(f.Fd()), 0, length, syscall.PROT_READ, syscall.MAP_SHARED) } func munmap(b []byte) (err error) { - return unix.Munmap(b) -} - -// unix.Madvise is not defined for darwin, so we define it ourselves. -func madvise(b []byte, advice int) (err error) { - _, _, e1 := unix.Syscall(unix.SYS_MADVISE, uintptr(unsafe.Pointer(&b[0])), uintptr(len(b)), uintptr(advice)) - if e1 != 0 { - err = e1 - } - return + return syscall.Munmap(b) } diff --git a/db_windows.go b/db_windows.go new file mode 100644 index 000000000..6285e6df7 --- /dev/null +++ b/db_windows.go @@ -0,0 +1,34 @@ +package tsdb + +import ( + "os" + "syscall" + "unsafe" +) + +func mmap(f *os.File, sz int) ([]byte, error) { + low, high := uint32(size), uint32(size>>32) + + h, errno := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, syscall.PAGE_READONLY, low, high, nil) + if h == 0 { + return os.NewSyscallError("CreateFileMapping", errno) + } + + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return os.NewSyscallError("MapViewOfFile", errno) + } + + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return os.NewSyscallError("CloseHandle", err) + } + + return (*[1 << 30]byte)(unsafe.Pointer(addr))[:sz], nil +} + +func munmap(b []byte) error { + if err := syscall.UnmapViewOfFile((uintptr)(unsafe.Pointer(&b[0]))); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +}