summaryrefslogtreecommitdiff
path: root/sysdep/unix/alloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdep/unix/alloc.c')
-rw-r--r--sysdep/unix/alloc.c23
1 files changed, 23 insertions, 0 deletions
diff --git a/sysdep/unix/alloc.c b/sysdep/unix/alloc.c
index f6296afe..4c9d5eb5 100644
--- a/sysdep/unix/alloc.c
+++ b/sysdep/unix/alloc.c
@@ -17,6 +17,7 @@
#endif
long page_size = 0;
+_Bool alloc_multipage = 0;
#ifdef HAVE_MMAP
static _Bool use_fake = 0;
@@ -45,9 +46,31 @@ alloc_sys_page(void)
#ifdef HAVE_MMAP
if (!use_fake)
{
+ if (alloc_multipage)
+ {
+ void *big = mmap(NULL, page_size * 2, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
+ if (big == MAP_FAILED)
+ bug("mmap(%lu) failed: %m", page_size);
+
+ uintptr_t offset = ((uintptr_t) big) % page_size;
+ if (offset)
+ {
+ void *ret = big + page_size - offset;
+ munmap(big, page_size - offset);
+ munmap(ret + page_size, offset);
+ return ret;
+ }
+ else
+ {
+ munmap(big + page_size, page_size);
+ return big;
+ }
+ }
+
void *ret = mmap(NULL, page_size, PROT_WRITE | PROT_READ, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (ret == MAP_FAILED)
bug("mmap(%lu) failed: %m", page_size);
+
return ret;
}
else