[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