diff options
author | Ben Johnson <benbjohnson@yahoo.com> | 2014-06-11 11:11:21 -0600 |
---|---|---|
committer | Ben Johnson <benbjohnson@yahoo.com> | 2014-06-11 11:11:21 -0600 |
commit | c2577db1c22e0bb64ea3df16e9424e6dce1d55ab (patch) | |
tree | 4deb66bd7914dd52129b62bfb99ee2238e76af66 /bolt_windows.go | |
parent | Merge pull request #189 from benbjohnson/increase-max-nodes-per-page (diff) | |
download | dedo-c2577db1c22e0bb64ea3df16e9424e6dce1d55ab.tar.gz dedo-c2577db1c22e0bb64ea3df16e9424e6dce1d55ab.tar.xz |
Add Windows support.
Diffstat (limited to 'bolt_windows.go')
-rw-r--r-- | bolt_windows.go | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/bolt_windows.go b/bolt_windows.go new file mode 100644 index 0000000..9962f03 --- /dev/null +++ b/bolt_windows.go @@ -0,0 +1,60 @@ +package bolt + +import ( + "os" + "syscall" + "unsafe" +) + +var odirect int + +// fdatasync flushes written data to a file descriptor. +func fdatasync(f *os.File) error { + return f.Sync() +} + +// flock acquires an advisory lock on a file descriptor. +func flock(f *os.File) error { + return nil +} + +// funlock releases an advisory lock on a file descriptor. +func funlock(f *os.File) error { + return nil +} + +// mmap memory maps a file to a byte slice. +// Based on: https://github.com/edsrzf/mmap-go +func mmap(f *os.File, sz int) ([]byte, error) { + // Open a file mapping handle. + sizelo, sizehi := uint32(sz>>32), uint32(sz&0xffffffff) + h, errno := syscall.CreateFileMapping(syscall.Handle(f.Fd()), nil, syscall.PAGE_READONLY, sizehi, sizelo, nil) + if h == 0 { + return nil, os.NewSyscallError("CreateFileMapping", errno) + } + + // Create the memory map. + addr, errno := syscall.MapViewOfFile(h, syscall.FILE_MAP_READ, 0, 0, uintptr(sz)) + if addr == 0 { + return nil, os.NewSyscallError("MapViewOfFile", errno) + } + + // Close mapping handle. + if err := syscall.CloseHandle(syscall.Handle(h)); err != nil { + return nil, os.NewSyscallError("CloseHandle", err) + } + + // Convert to a byte slice. + b := ((*[0xFFFFFFF]byte)(unsafe.Pointer(addr)))[0:sz] + return b, nil +} + +// munmap unmaps a pointer from a file. +// Based on: https://github.com/edsrzf/mmap-go +func munmap(b []byte) error { + addr := (uintptr)(unsafe.Pointer(&b[0])) + if err := syscall.UnmapViewOfFile(addr); err != nil { + return os.NewSyscallError("UnmapViewOfFile", err) + } + return nil +} |