aboutsummaryrefslogtreecommitdiffstats
path: root/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go
diff options
context:
space:
mode:
Diffstat (limited to 'vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go')
-rw-r--r--vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go38
1 files changed, 38 insertions, 0 deletions
diff --git a/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go
new file mode 100644
index 000000000..1a6e83dad
--- /dev/null
+++ b/vendor/github.com/Azure/azure-storage-blob-go/2018-03-28/azblob/zc_mmf_windows.go
@@ -0,0 +1,38 @@
+package azblob
+
+import (
+ "os"
+ "reflect"
+ "syscall"
+ "unsafe"
+)
+
+type mmf []byte
+
+func newMMF(file *os.File, writable bool, offset int64, length int) (mmf, error) {
+ prot, access := uint32(syscall.PAGE_READONLY), uint32(syscall.FILE_MAP_READ) // Assume read-only
+ if writable {
+ prot, access = uint32(syscall.PAGE_READWRITE), uint32(syscall.FILE_MAP_WRITE)
+ }
+ hMMF, errno := syscall.CreateFileMapping(syscall.Handle(file.Fd()), nil, prot, uint32(int64(length)>>32), uint32(int64(length)&0xffffffff), nil)
+ if hMMF == 0 {
+ return nil, os.NewSyscallError("CreateFileMapping", errno)
+ }
+ defer syscall.CloseHandle(hMMF)
+ addr, errno := syscall.MapViewOfFile(hMMF, access, uint32(offset>>32), uint32(offset&0xffffffff), uintptr(length))
+ m := mmf{}
+ h := (*reflect.SliceHeader)(unsafe.Pointer(&m))
+ h.Data = addr
+ h.Len = length
+ h.Cap = h.Len
+ return m, nil
+}
+
+func (m *mmf) unmap() {
+ addr := uintptr(unsafe.Pointer(&(([]byte)(*m)[0])))
+ *m = mmf{}
+ err := syscall.UnmapViewOfFile(addr)
+ if err != nil {
+ panic(err)
+ }
+}