diff options
Diffstat (limited to 'libsigsegv/tests/mmaputil.h')
-rw-r--r-- | libsigsegv/tests/mmaputil.h | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/libsigsegv/tests/mmaputil.h b/libsigsegv/tests/mmaputil.h new file mode 100644 index 00000000..707b34c5 --- /dev/null +++ b/libsigsegv/tests/mmaputil.h @@ -0,0 +1,105 @@ +/* Some auxiliary stuff for using mmap & friends. + Copyright (C) 2002-2003 Bruno Haible <bruno@clisp.org> + + 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., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, 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 <windows.h> +#include <winerror.h> +#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 <sys/types.h> +#include <sys/mman.h> + +#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 <fcntl.h> +# 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 |