[pypy-commit] pypy default: disable arena_mmap, fix win32 translation?

mattip pypy.commits at gmail.com
Wed Feb 7 15:38:00 EST 2018


Author: Matti Picus <matti.picus at gmail.com>
Branch: 
Changeset: r93783:4cf1cfb34efc
Date: 2018-02-07 15:36 -0500
http://bitbucket.org/pypy/pypy/changeset/4cf1cfb34efc/

Log:	disable arena_mmap, fix win32 translation?

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
@@ -9,6 +9,7 @@
 WORD_POWER_2 = {32: 2, 64: 3}[LONG_BIT]
 assert 1 << WORD_POWER_2 == WORD
 
+USE_MMAP = False
 
 # Terminology: the memory is subdivided into "arenas" containing "pages".
 # A page contains a number of allocated objects, called "blocks".
@@ -296,7 +297,10 @@
         #
         # 'arena_base' points to the start of malloced memory; it might not
         # be a page-aligned address
-        arena_base = llarena.arena_mmap(self.arena_size)
+        if USE_MMAP:
+            arena_base = llarena.arena_mmap(self.arena_size)
+        else:
+            arena_base = llarena.arena_malloc(self.arena_size, False)
         self.total_memory_alloced += self.arena_size
         self.peak_memory_alloced = max(self.total_memory_alloced,
                                        self.peak_memory_alloced)
@@ -406,7 +410,11 @@
                 if arena.nfreepages == arena.totalpages:
                     #
                     # The whole arena is empty.  Free it.
-                    llarena.arena_munmap(arena.base, self.arena_size)
+                    if USE_MMAP:
+                        llarena.arena_munmap(arena.base, self.arena_size)
+                    else:
+                        llarena.arena_reset(arena.base, self.arena_size, 4)
+                        llarena.arena_free(arena.base)
                     self.total_memory_alloced -= self.arena_size
                     lltype.free(arena, flavor='raw', track_allocation=False)
                     self.arenas_count -= 1
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
@@ -2,7 +2,7 @@
 from rpython.rtyper.lltypesystem import llmemory
 from rpython.rlib.rarithmetic import is_valid_int
 from rpython.rtyper.lltypesystem.lloperation import llop
-
+import os, sys
 
 # An "arena" is a large area of memory which can hold a number of
 # objects, not necessarily all of the same type or size.  It's used by
@@ -327,15 +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)
+if os.name == 'posix':
+    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, nbytes):
-    """Release an arena allocated with arena_mmap()."""
-    arena_free(arena_addr)
-    assert nbytes == arena_addr.arena.nbytes
+    def arena_munmap(arena_addr, nbytes):
+        """Release an arena allocated with arena_mmap()."""
+        arena_free(arena_addr)
+        assert nbytes == arena_addr.arena.nbytes
 
 
 def arena_reset(arena_addr, size, zero):
@@ -404,7 +405,6 @@
 # We can tweak these implementations to be more suited to very large
 # chunks of memory.
 
-import os, sys
 from rpython.rtyper.lltypesystem import rffi, lltype
 from rpython.rtyper.extfunc import register_external
 from rpython.rtyper.tool.rffi_platform import memory_alignment
@@ -541,30 +541,31 @@
                   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)
+if os.name == 'posix':
+    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
-    assert nbytes >= 0
-    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_munmap(arena_addr, nbytes):
+        from rpython.rlib import rmmap
+        assert nbytes >= 0
+        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:


More information about the pypy-commit mailing list