Blame vendor/github.com/Azure/azure-storage-blob-go/azblob/zc_mmf_windows.go

Packit 63bb0d
package azblob
Packit 63bb0d
Packit 63bb0d
import (
Packit 63bb0d
	"os"
Packit 63bb0d
	"reflect"
Packit 63bb0d
	"syscall"
Packit 63bb0d
	"unsafe"
Packit 63bb0d
)
Packit 63bb0d
Packit 63bb0d
type mmf []byte
Packit 63bb0d
Packit 63bb0d
func newMMF(file *os.File, writable bool, offset int64, length int) (mmf, error) {
Packit 63bb0d
	prot, access := uint32(syscall.PAGE_READONLY), uint32(syscall.FILE_MAP_READ) // Assume read-only
Packit 63bb0d
	if writable {
Packit 63bb0d
		prot, access = uint32(syscall.PAGE_READWRITE), uint32(syscall.FILE_MAP_WRITE)
Packit 63bb0d
	}
Packit 63bb0d
	hMMF, errno := syscall.CreateFileMapping(syscall.Handle(file.Fd()), nil, prot, uint32(int64(length)>>32), uint32(int64(length)&0xffffffff), nil)
Packit 63bb0d
	if hMMF == 0 {
Packit 63bb0d
		return nil, os.NewSyscallError("CreateFileMapping", errno)
Packit 63bb0d
	}
Packit 63bb0d
	defer syscall.CloseHandle(hMMF)
Packit 63bb0d
	addr, errno := syscall.MapViewOfFile(hMMF, access, uint32(offset>>32), uint32(offset&0xffffffff), uintptr(length))
Packit 63bb0d
	m := mmf{}
Packit 63bb0d
	h := (*reflect.SliceHeader)(unsafe.Pointer(&m))
Packit 63bb0d
	h.Data = addr
Packit 63bb0d
	h.Len = length
Packit 63bb0d
	h.Cap = h.Len
Packit 63bb0d
	return m, nil
Packit 63bb0d
}
Packit 63bb0d
Packit 63bb0d
func (m *mmf) unmap() {
Packit 63bb0d
	addr := uintptr(unsafe.Pointer(&(([]byte)(*m)[0])))
Packit 63bb0d
	*m = mmf{}
Packit 63bb0d
	err := syscall.UnmapViewOfFile(addr)
Packit 63bb0d
	if err != nil {
Packit 63bb0d
		panic("if we are unable to unmap the memory-mapped file, there is serious concern for memory corruption")
Packit 63bb0d
	}
Packit 63bb0d
}