Skip to content
This repository has been archived by the owner on Jan 30, 2023. It is now read-only.

Commit

Permalink
mmap() PARI stack with MAP_NORESERVE (for Cygwin)
Browse files Browse the repository at this point in the history
  • Loading branch information
jdemeyer committed Apr 4, 2017
1 parent 8725c63 commit 343f241
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 1 deletion.
2 changes: 1 addition & 1 deletion build/pkgs/pari/package-version.txt
Original file line number Diff line number Diff line change
@@ -1 +1 @@
2.9.1.p2
2.9.1.p3
53 changes: 53 additions & 0 deletions build/pkgs/pari/patches/prot_none_4.patch
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

0 comments on commit 343f241

Please sign in to comment.