/* Some auxiliary stuff for using mmap & friends. Copyright (C) 2002-2003 Bruno Haible This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. */ #if defined _WIN32 && !defined __CYGWIN__ # define HAVE_WIN32_VM #else # include "config.h" #endif #ifdef HAVE_WIN32_VM /* ------------------------ Windows ------------------------ */ #define WIN32_LEAN_AND_MEAN /* avoid including junk */ #include #include #define PROT_NONE PAGE_NOACCESS #define PROT_READ PAGE_READONLY #define PROT_READ_WRITE PAGE_READWRITE static void * mmap_zeromap (void *map_addr_hint, unsigned long map_len) { if (VirtualAlloc ((void *)((unsigned long) map_addr_hint & -0x10000), (((unsigned long) map_addr_hint + map_len - 1) | 0xffff) + 1 - ((unsigned long) map_addr_hint & -0x10000), MEM_RESERVE, PAGE_NOACCESS) && VirtualAlloc (map_addr_hint, map_len, MEM_COMMIT, PAGE_READWRITE)) return map_addr_hint; else return (void *)(-1); } int munmap (void *addr, unsigned long len) { if (VirtualFree (addr, len, MEM_DECOMMIT)) return 0; else return -1; } int mprotect (void *addr, unsigned long len, int prot) { DWORD oldprot; if (VirtualProtect (addr, len, prot, &oldprot)) return 0; else return -1; } #else /* ------------------------ Unix ------------------------ */ #include #include #ifndef PROT_NONE # define PROT_NONE 0 #endif #define PROT_READ_WRITE (PROT_READ|PROT_WRITE) #if HAVE_MMAP_ANON # define zero_fd -1 # define map_flags MAP_ANON | MAP_PRIVATE #elif HAVE_MMAP_ANONYMOUS # define zero_fd -1 # define map_flags MAP_ANONYMOUS | MAP_PRIVATE #elif HAVE_MMAP_DEVZERO # include # ifndef MAP_FILE # define MAP_FILE 0 # endif static int zero_fd; # define map_flags MAP_FILE | MAP_PRIVATE #endif static void * mmap_zeromap (void *map_addr_hint, unsigned long map_len) { #ifdef __hpux /* HP-UX 10 mmap() often fails when given a hint. So give the OS complete freedom about the address range. */ return (void *) mmap ((void *) 0, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0); #else return (void *) mmap (map_addr_hint, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0); #endif } #endif