diff options
Diffstat (limited to 'sysdep/unix/alloc.c')
-rw-r--r-- | sysdep/unix/alloc.c | 23 |
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 |