root/maint/gnulib/tests/mmap-anon-util.h

/* [previous][next][first][last][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. mmap_zeromap
  2. munmap
  3. mprotect
  4. mmap_zeromap

   1 /* Some auxiliary stuff for using mmap & friends.
   2    Copyright (C) 2002-2021 Free Software Foundation, Inc.
   3 
   4    This program is free software: you can redistribute it and/or modify
   5    it under the terms of the GNU General Public License as published by
   6    the Free Software Foundation; either version 2 of the License, or
   7    (at your option) any later version.
   8 
   9    This program is distributed in the hope that it will be useful,
  10    but WITHOUT ANY WARRANTY; without even the implied warranty of
  11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  12    GNU General Public License for more details.
  13 
  14    You should have received a copy of the GNU General Public License
  15    along with this program.  If not, see <https://www.gnu.org/licenses/>.  */
  16 
  17 /* Written by Bruno Haible.  */
  18 
  19 #if defined _WIN32 && !defined __CYGWIN__
  20 
  21 /* ------------------------ Windows ------------------------ */
  22 
  23 # define WIN32_LEAN_AND_MEAN /* avoid including junk */
  24 # include <windows.h>
  25 # include <winerror.h>
  26 # define PROT_NONE PAGE_NOACCESS
  27 # define PROT_READ PAGE_READONLY
  28 # define PROT_READ_WRITE PAGE_READWRITE
  29 
  30 static void *
  31 mmap_zeromap (void *map_addr_hint, size_t map_len)
     /* [previous][next][first][last][top][bottom][index][help] */
  32 {
  33   if (VirtualAlloc ((void *)((uintptr_t) map_addr_hint & -0x10000),
  34                     (((uintptr_t) map_addr_hint + map_len - 1) | 0xffff) + 1
  35                     - ((uintptr_t) map_addr_hint & -0x10000),
  36                     MEM_RESERVE, PAGE_NOACCESS)
  37       && VirtualAlloc (map_addr_hint, map_len, MEM_COMMIT, PAGE_READWRITE))
  38     return map_addr_hint;
  39   else
  40     return (void *)(-1);
  41 }
  42 
  43 int
  44 munmap (void *addr, size_t len)
     /* [previous][next][first][last][top][bottom][index][help] */
  45 {
  46   if (VirtualFree (addr, len, MEM_DECOMMIT))
  47     return 0;
  48   else
  49     return -1;
  50 }
  51 
  52 int
  53 mprotect (void *addr, size_t len, int prot)
     /* [previous][next][first][last][top][bottom][index][help] */
  54 {
  55   DWORD oldprot;
  56 
  57   if (VirtualProtect (addr, len, prot, &oldprot))
  58     return 0;
  59   else
  60     return -1;
  61 }
  62 
  63 #else
  64 
  65 /* ------------------------ Unix ------------------------ */
  66 
  67 # include <sys/types.h>
  68 # include <sys/mman.h>
  69 # include <fcntl.h>
  70 
  71 # ifndef PROT_NONE
  72 #  define PROT_NONE 0
  73 # endif
  74 # define PROT_READ_WRITE  (PROT_READ|PROT_WRITE)
  75 
  76 # if HAVE_MAP_ANONYMOUS
  77 #  define zero_fd -1
  78 #  define map_flags MAP_ANONYMOUS | MAP_PRIVATE
  79 # else
  80 #  ifndef MAP_FILE
  81 #   define MAP_FILE 0
  82 #  endif
  83 static int zero_fd;
  84 #  define map_flags MAP_FILE | MAP_PRIVATE
  85 # endif
  86 
  87 static void *
  88 mmap_zeromap (void *map_addr_hint, size_t map_len)
     /* [previous][next][first][last][top][bottom][index][help] */
  89 {
  90 # ifdef __hpux
  91   /* HP-UX 10 mmap() often fails when given a hint.  So give the OS complete
  92      freedom about the address range.  */
  93   return (void *) mmap ((void *) 0,    map_len, PROT_READ_WRITE, map_flags, zero_fd, 0);
  94 # else
  95   return (void *) mmap (map_addr_hint, map_len, PROT_READ_WRITE, map_flags, zero_fd, 0);
  96 # endif
  97 }
  98 
  99 #endif

/* [previous][next][first][last][top][bottom][index][help] */