//go:build !js
// +build !js

/*
 * SPDX-FileCopyrightText: © Hypermode Inc. <hello@hypermode.com>
 * SPDX-License-Identifier: Apache-2.0
 */

package z

import (
	
	

	
)

// mmap uses the mmap system call to memory-map a file. If writable is true,
// memory protection of the pages is set so that they may be written to as well.
func mmap( *os.File,  bool,  int64) ([]byte, error) {
	 := unix.PROT_READ
	if  {
		 |= unix.PROT_WRITE
	}
	return unix.Mmap(int(.Fd()), 0, int(), , unix.MAP_SHARED)
}

// munmap unmaps a previously mapped slice.
//
// unix.Munmap maintains an internal list of mmapped addresses, and only calls munmap
// if the address is present in that list. If we use mremap, this list is not updated.
// To bypass this, we call munmap ourselves.
func munmap( []byte) error {
	if len() == 0 || len() != cap() {
		return unix.EINVAL
	}
	, ,  := unix.Syscall(
		unix.SYS_MUNMAP,
		uintptr(unsafe.Pointer(&[0])),
		uintptr(len()),
		0,
	)
	if  != 0 {
		return 
	}
	return nil
}

// madvise uses the madvise system call to give advise about the use of memory
// when using a slice that is memory-mapped to a file. Set the readahead flag to
// false if page references are expected in random order.
func madvise( []byte,  bool) error {
	 := unix.MADV_NORMAL
	if ! {
		 = unix.MADV_RANDOM
	}
	return unix.Madvise(, )
}

// msync writes any modified data to persistent storage.
func msync( []byte) error {
	return unix.Msync(, unix.MS_SYNC)
}