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