aboutsummaryrefslogtreecommitdiffstats
path: root/epan/emem.c
diff options
context:
space:
mode:
authorGuy Harris <guy@alum.mit.edu>2006-06-17 02:31:56 +0000
committerGuy Harris <guy@alum.mit.edu>2006-06-17 02:31:56 +0000
commit535a8bd006e686cc1e5287d7c45031c4a36d4b8f (patch)
tree24230f14034d2e66a6d14f5b01e85d514e0df8a5 /epan/emem.c
parent2288c8590d153c96e1793b086c164119c518ddb5 (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.c21
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;