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 |
}
|