Sponsoring The Perl Toolchain Summit 2025: Help make this important event another success Learn more

#if defined(WIN32) && !defined(__CYGWIN__)
# include <windows.h>
# include <io.h>
# define PROT_NONE 0
# define PROT_READ 1
# define PROT_WRITE 2
# define PROT_EXEC 4
# define MAP_SHARED 0
# define MAP_PRIVATE 1
# define MAP_ANONYMOUS 2
# define MAP_FAILED ((void *) -1)
# define PROT_ALL (PROT_READ | PROT_WRITE | PROT_EXEC)
# ifndef FILE_MAP_EXECUTE
# define FILE_MAP_EXECUTE 0
# endif
# define BITS32_MASK 0xFFFFFFFF
static DWORD page_size() {
static DWORD pagesize = 0;
if (pagesize == 0) {
SYSTEM_INFO info;
GetSystemInfo(&info);
pagesize = info.dwPageSize;
}
return pagesize;
}
static DWORD old_protect;
static const struct {
DWORD createflag;
DWORD viewflag;
} winflags[] = {
{ 0 , 0 }, /* PROT_NONE */
{ PAGE_READONLY , FILE_MAP_READ }, /* PROT_READ */
{ PAGE_READWRITE, FILE_MAP_WRITE }, /* PROT_WRITE */
{ PAGE_READWRITE, FILE_MAP_ALL_ACCESS }, /* PROT_READ | PROT_WRITE */
{ PAGE_EXECUTE_READ , FILE_MAP_READ | FILE_MAP_EXECUTE}, /* PROT_NONE | PROT_EXEC */
{ PAGE_EXECUTE_READ , FILE_MAP_READ | FILE_MAP_EXECUTE}, /* PROT_READ | PROT_EXEC */
{ PAGE_EXECUTE_READWRITE, FILE_MAP_WRITE | FILE_MAP_EXECUTE}, /* PROT_WRITE | PROT_EXEC */
{ PAGE_EXECUTE_READWRITE, FILE_MAP_ALL_ACCESS | FILE_MAP_EXECUTE}, /* PROT_READ| PROT_WRITE | PROT_EXEC */
};
void* mmap(void* address, size_t length, int prot, int flags, int fd, unsigned long long offset) {
HANDLE file;
HANDLE mapping;
DWORD viewflag;
unsigned long long maxsize = offset + length;
prot &= PROT_ALL;
file = (flags & MAP_ANONYMOUS) ? INVALID_HANDLE_VALUE : (HANDLE)_get_osfhandle(fd);
mapping = CreateFileMapping(file, NULL, winflags[prot].createflag, maxsize >> 32, maxsize & BITS32_MASK, NULL);
if (mapping == NULL)
return MAP_FAILED;
viewflag = (flags & MAP_PRIVATE) ? (FILE_MAP_COPY | ( prot & PROT_EXEC ? FILE_MAP_EXECUTE : 0 ) ) : winflags[prot].viewflag;
address = MapViewOfFile(mapping, viewflag, offset >> 32, offset & BITS32_MASK, length);
CloseHandle(mapping);
if (address == NULL)
return MAP_FAILED;
return address;
}
# define munmap(address, length) ( UnmapViewOfFile(address) ? 0 : -1 )
# define msync(address, length, flags) ( FlushViewOfFile(address, length) ? 0 : -1 )
# define mlock(address, length) ( VirtualLock(address, length) ? 0 : -1 )
# define munlock(address, length) ( VirtualUnlock(address, length) ? 0 : -1 )
# define mprotect(address, length, prot) ( VirtualProtect(address, length, winflags[prot & PROT_ALL].createflag, &old_protect) ? 0 : -1 )
#define madvise(address, length, advice) 0
#else /* WIN32 */
# include <string.h>
# include <sys/types.h>
# include <sys/mman.h>
# include <unistd.h>
static size_t page_size() {
static size_t pagesize = 0;
if (pagesize == 0)
pagesize = sysconf(_SC_PAGESIZE);
return pagesize;
}
#ifdef VMS
# define madvise(address, length, advice) 0
#elif defined(__CYGWIN__) || defined(__QNX__)
# define madvise posix_madvise
#endif
#endif /* WIN32 */
#ifndef MADV_NORMAL
# define MADV_NORMAL 0
# define MADV_RANDOM 0
# define MADV_SEQUENTIAL 0
# define MADV_WILLNEED 0
# define MADV_DONTNEED 0
#endif
#ifndef MAP_ANONYMOUS
# define MAP_ANONYMOUS MAP_ANON
#elif !defined MAP_ANON
# define MAP_ANON MAP_ANONYMOUS
#endif /* MAP_ANONYMOUS */
#ifndef MAP_FILE
# define MAP_FILE 0
#endif
#ifndef MAP_VARIABLE
# define MAP_VARIABLE 0
#endif