diff options
author | Guy Harris <guy@alum.mit.edu> | 2006-06-17 02:31:56 +0000 |
---|---|---|
committer | Guy Harris <guy@alum.mit.edu> | 2006-06-17 02:31:56 +0000 |
commit | 535a8bd006e686cc1e5287d7c45031c4a36d4b8f (patch) | |
tree | 24230f14034d2e66a6d14f5b01e85d514e0df8a5 /epan/emem.c | |
parent | 2288c8590d153c96e1793b086c164119c518ddb5 (diff) |
Not all UN*Xes have MAP_ANONYMOUS; some have MAP_ANON instead, and some
have neither. For those with MAP_ANON but not MAP_ANONYMOUS, use
MAP_ANON; for those with neither, add some code to use "/dev/zero".
svn path=/trunk/; revision=18488
Diffstat (limited to 'epan/emem.c')
-rw-r--r-- | epan/emem.c | 21 |
1 files changed, 20 insertions, 1 deletions
diff --git a/epan/emem.c b/epan/emem.c index 9b95de9189..e1b51a3714 100644 --- a/epan/emem.c +++ b/epan/emem.c @@ -72,6 +72,21 @@ #include <stdint.h> #include <sys/types.h> #include <sys/mman.h> +#if defined(MAP_ANONYMOUS) +#define ANON_PAGE_MODE (MAP_ANONYMOUS|MAP_PRIVATE) +#elif defined(MAP_ANON) +#define ANON_PAGE_MODE (MAP_ANON|MAP_PRIVATE) +#else +#define ANON_PAGE_MODE (MAP_PRIVATE) /* have to map /dev/zero */ +#define NEED_DEV_ZERO +#endif +#ifdef NEED_DEV_ZERO +#include <fcntl.h> +static int dev_zero_fd; +#define ANON_FD dev_zero_fd +#else +#define ANON_FD -1 +#endif #define USE_GUARD_PAGES 1 #endif #endif @@ -217,6 +232,10 @@ ep_init_chunk(void) #elif defined(USE_GUARD_PAGES) pagesize = sysconf(_SC_PAGESIZE); +#ifdef NEED_DEV_ZERO + dev_zero_fd = open("/dev/zero", O_RDWR); + g_assert(dev_zero_fd != -1); +#endif #endif /* _WIN32 / USE_GUARD_PAGES */ #endif /* SE_DEBUG_FREE */ @@ -288,7 +307,7 @@ emem_create_chunk(emem_chunk_t **free_list) { #elif defined(USE_GUARD_PAGES) npc->buf = mmap(NULL, EMEM_PACKET_CHUNK_SIZE, - PROT_READ|PROT_WRITE, MAP_ANONYMOUS|MAP_PRIVATE, -1, 0); + PROT_READ|PROT_WRITE, ANON_PAGE_MODE, ANON_FD, 0); g_assert(npc->buf != MAP_FAILED); buf_end = npc->buf + EMEM_PACKET_CHUNK_SIZE; |