github.com/database64128/shadowsocks-go@v1.7.0/mmap/mmap_unixwindows.go (about)

     1  //go:build unix || windows
     2  
     3  package mmap
     4  
     5  import (
     6  	"os"
     7  	"unsafe"
     8  )
     9  
    10  // ReadFile maps the named file into memory for reading.
    11  func ReadFile[T ~[]byte | ~string](name string) (data T, err error) {
    12  	f, err := os.Open(name)
    13  	if err != nil {
    14  		return
    15  	}
    16  	defer f.Close()
    17  
    18  	fs, err := f.Stat()
    19  	if err != nil {
    20  		return
    21  	}
    22  
    23  	size := fs.Size()
    24  	if size == 0 {
    25  		return
    26  	}
    27  
    28  	addr, err := readFile(f, size)
    29  	if err != nil {
    30  		return
    31  	}
    32  
    33  	b := unsafe.Slice((*byte)(unsafe.Pointer(addr)), size)
    34  	return *(*T)(unsafe.Pointer(&b)), nil
    35  }
    36  
    37  // Unmap removes the memory mapping.
    38  func Unmap[T ~[]byte | ~string](data T) error {
    39  	if len(data) == 0 {
    40  		return nil
    41  	}
    42  	return unmap(*(*uintptr)(unsafe.Pointer(&data)), len(data))
    43  }