Author: Armin Rigo <[email protected]>
Branch: mmap-for-arenas
Changeset: r93218:6412ce4e1198
Date: 2017-11-30 17:30 +0100
http://bitbucket.org/pypy/pypy/changeset/6412ce4e1198/

Log:    (fijal, arigo)

        Trying to use mmap() to allocate arenas

diff --git a/rpython/memory/gc/minimarkpage.py 
b/rpython/memory/gc/minimarkpage.py
--- a/rpython/memory/gc/minimarkpage.py
+++ b/rpython/memory/gc/minimarkpage.py
@@ -292,7 +292,7 @@
         #
         # 'arena_base' points to the start of malloced memory; it might not
         # be a page-aligned address
-        arena_base = llarena.arena_malloc(self.arena_size, False)
+        arena_base = llarena.arena_mmap(self.arena_size)
         if not arena_base:
             out_of_memory("out of memory: couldn't allocate the next arena")
         arena_end = arena_base + self.arena_size
@@ -395,8 +395,7 @@
                 if arena.nfreepages == arena.totalpages:
                     #
                     # The whole arena is empty.  Free it.
-                    llarena.arena_reset(arena.base, self.arena_size, 4)
-                    llarena.arena_free(arena.base)
+                    llarena.arena_munmap(arena.base, self.arena_size)
                     lltype.free(arena, flavor='raw', track_allocation=False)
                     #
                 else:
diff --git a/rpython/rtyper/lltypesystem/llarena.py 
b/rpython/rtyper/lltypesystem/llarena.py
--- a/rpython/rtyper/lltypesystem/llarena.py
+++ b/rpython/rtyper/lltypesystem/llarena.py
@@ -327,6 +327,16 @@
     assert not arena_addr.arena.objectptrs
     arena_addr.arena.mark_freed()
 
+def arena_mmap(nbytes):
+    """Allocate and return a new arena, zero-initialized by the
+    system, calling mmap()."""
+    return arena_malloc(nbytes, True)
+
+def arena_munmap(arena_addr):
+    """Release an arena allocated with arena_mmap()."""
+    arena_free(arena_addr)
+
+
 def arena_reset(arena_addr, size, zero):
     """Free all objects in the arena, which can then be reused.
     This can also be used on a subrange of the arena.
@@ -530,6 +540,30 @@
                   llfakeimpl=arena_free,
                   sandboxsafe=True)
 
+def llimpl_arena_mmap(nbytes):
+    from rpython.rlib import rmmap
+    flags = rmmap.MAP_PRIVATE | rmmap.MAP_ANONYMOUS
+    prot = rmmap.PROT_READ | rmmap.PROT_WRITE
+    p = rffi.cast(llmemory.Address, rmmap.c_mmap_safe(
+        lltype.nullptr(rmmap.PTR.TO), nbytes, prot, flags, -1, 0))
+    if p == rffi.cast(llmemory.Address, -1):
+        p = rffi.cast(llmemory.Address, 0)
+    return p
+register_external(arena_mmap, [int], llmemory.Address,
+                  'll_arena.arena_mmap',
+                  llimpl=llimpl_arena_mmap,
+                  llfakeimpl=arena_mmap,
+                  sandboxsafe=True)
+
+def llimpl_arena_munmap(arena_addr, nbytes):
+    from rpython.rlib import rmmap
+    rmmap.c_munmap_safe(rffi.cast(rmmap.PTR, arena_addr), nbytes)
+register_external(arena_munmap, [llmemory.Address, int], None,
+                  'll_arena.arena_munmap',
+                  llimpl=llimpl_arena_munmap,
+                  llfakeimpl=arena_munmap,
+                  sandboxsafe=True)
+
 def llimpl_arena_reset(arena_addr, size, zero):
     if zero:
         if zero == 1:
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit

Reply via email to