This repository has been archived by the owner on Jan 30, 2023. It is now read-only.
-
-
Notifications
You must be signed in to change notification settings - Fork 7
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
mmap() PARI stack with MAP_NORESERVE (for Cygwin)
- Loading branch information
Showing
2 changed files
with
54 additions
and
1 deletion.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1 @@ | ||
2.9.1.p2 | ||
2.9.1.p3 |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,53 @@ | ||
commit c3dc1546580eda3bff6243cf563801c8a26ec67f | ||
Author: Jeroen Demeyer <jdemeyer@cage.ugent.be> | ||
Date: Mon Apr 3 16:11:54 2017 +0200 | ||
|
||
mmap the PARI stack with MAP_NORESERVE | ||
|
||
diff --git a/src/language/init.c b/src/language/init.c | ||
index 34cce31..acebe2f 100644 | ||
--- a/src/language/init.c | ||
+++ b/src/language/init.c | ||
@@ -597,12 +597,26 @@ pari_add_defaults_module(entree *ep) | ||
#ifndef MAP_ANONYMOUS | ||
#define MAP_ANONYMOUS MAP_ANON | ||
#endif | ||
+#ifndef MAP_NORESERVE | ||
+#define MAP_NORESERVE 0 | ||
+#endif | ||
static void * | ||
pari_mainstack_malloc(size_t size) | ||
{ | ||
+ /* Check that the system allows reserving "size" bytes. This is just | ||
+ * a check, we immediately free the memory. */ | ||
void *b = mmap(NULL, size, PROT_READ|PROT_WRITE, | ||
MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); | ||
- return (b == MAP_FAILED) ? NULL: b; | ||
+ if (b == MAP_FAILED) return NULL; | ||
+ munmap(b, size); | ||
+ | ||
+ /* Map again, this time with MAP_NORESERVE. On some operating systems | ||
+ * like Cygwin, this is needed because remapping with PROT_NONE and | ||
+ * MAP_NORESERVE does not work as expected. */ | ||
+ b = mmap(NULL, size, PROT_READ|PROT_WRITE, | ||
+ MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0); | ||
+ if (b == MAP_FAILED) return NULL; | ||
+ return b; | ||
} | ||
|
||
static void | ||
@@ -628,7 +642,13 @@ static void | ||
pari_mainstack_mreset(pari_sp from, pari_sp to) | ||
{ | ||
size_t s = to - from; | ||
- mmap((void*)from, s, PROT_NONE, MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS, -1, 0); | ||
+ void *addr, *res; | ||
+ if (!s) return; | ||
+ | ||
+ addr = (void*)from; | ||
+ res = mmap(addr, s, PROT_NONE, | ||
+ MAP_FIXED|MAP_PRIVATE|MAP_ANONYMOUS|MAP_NORESERVE, -1, 0); | ||
+ if (res != addr) pari_err(e_MEM); | ||
} | ||
|
||
/* Commit (make available) the virtual memory mapped between the |