[pypy-commit] pypy raw-memory-pressure-nursery: Refactor a bit way we trck additional memory pressure - target is to support it also in the nursery
fijal
noreply at buildbot.pypy.org
Tue Feb 14 17:49:19 CET 2012
Author: Maciej Fijalkowski <fijall at gmail.com>
Branch: raw-memory-pressure-nursery
Changeset: r52466:d712241e48ce
Date: 2012-02-14 17:39 +0100
http://bitbucket.org/pypy/pypy/changeset/d712241e48ce/
Log: Refactor a bit way we trck additional memory pressure - target is to
support it also in the nursery
diff --git a/pypy/annotation/builtin.py b/pypy/annotation/builtin.py
--- a/pypy/annotation/builtin.py
+++ b/pypy/annotation/builtin.py
@@ -411,8 +411,7 @@
from pypy.annotation.model import SomePtr
from pypy.rpython.lltypesystem import lltype
-def malloc(s_T, s_n=None, s_flavor=None, s_zero=None, s_track_allocation=None,
- s_add_memory_pressure=None):
+def malloc(s_T, s_n=None, s_flavor=None, s_zero=None, s_track_allocation=None):
assert (s_n is None or s_n.knowntype == int
or issubclass(s_n.knowntype, pypy.rlib.rarithmetic.base_int))
assert s_T.is_constant()
@@ -428,8 +427,6 @@
else:
assert s_flavor.is_constant()
assert s_track_allocation is None or s_track_allocation.is_constant()
- assert (s_add_memory_pressure is None or
- s_add_memory_pressure.is_constant())
# not sure how to call malloc() for the example 'p' in the
# presence of s_extraargs
r = SomePtr(lltype.Ptr(s_T.const))
diff --git a/pypy/jit/codewriter/jtransform.py b/pypy/jit/codewriter/jtransform.py
--- a/pypy/jit/codewriter/jtransform.py
+++ b/pypy/jit/codewriter/jtransform.py
@@ -502,7 +502,6 @@
def _rewrite_raw_malloc(self, op, name, args):
d = op.args[1].value.copy()
d.pop('flavor')
- add_memory_pressure = d.pop('add_memory_pressure', False)
zero = d.pop('zero', False)
track_allocation = d.pop('track_allocation', True)
if d:
@@ -510,8 +509,6 @@
TYPE = op.args[0].value
if zero:
name += '_zero'
- if add_memory_pressure:
- name += '_add_memory_pressure'
if not track_allocation:
name += '_no_track_allocation'
return self._do_builtin_call(op, name, args,
diff --git a/pypy/jit/codewriter/support.py b/pypy/jit/codewriter/support.py
--- a/pypy/jit/codewriter/support.py
+++ b/pypy/jit/codewriter/support.py
@@ -599,12 +599,10 @@
return _ll_0_alloc_with_del
def build_raw_malloc_varsize_builder(zero=False,
- add_memory_pressure=False,
track_allocation=True):
def build_ll_1_raw_malloc_varsize(ARRAY):
def _ll_1_raw_malloc_varsize(n):
return lltype.malloc(ARRAY, n, flavor='raw', zero=zero,
- add_memory_pressure=add_memory_pressure,
track_allocation=track_allocation)
return _ll_1_raw_malloc_varsize
return build_ll_1_raw_malloc_varsize
@@ -613,26 +611,16 @@
build_raw_malloc_varsize_builder())
build_ll_1_raw_malloc_varsize_zero = (
build_raw_malloc_varsize_builder(zero=True))
- build_ll_1_raw_malloc_varsize_zero_add_memory_pressure = (
- build_raw_malloc_varsize_builder(zero=True, add_memory_pressure=True))
- build_ll_1_raw_malloc_varsize_add_memory_pressure = (
- build_raw_malloc_varsize_builder(add_memory_pressure=True))
build_ll_1_raw_malloc_varsize_no_track_allocation = (
build_raw_malloc_varsize_builder(track_allocation=False))
build_ll_1_raw_malloc_varsize_zero_no_track_allocation = (
build_raw_malloc_varsize_builder(zero=True, track_allocation=False))
- build_ll_1_raw_malloc_varsize_zero_add_memory_pressure_no_track_allocation = (
- build_raw_malloc_varsize_builder(zero=True, add_memory_pressure=True, track_allocation=False))
- build_ll_1_raw_malloc_varsize_add_memory_pressure_no_track_allocation = (
- build_raw_malloc_varsize_builder(add_memory_pressure=True, track_allocation=False))
def build_raw_malloc_fixedsize_builder(zero=False,
- add_memory_pressure=False,
track_allocation=True):
def build_ll_0_raw_malloc_fixedsize(STRUCT):
def _ll_0_raw_malloc_fixedsize():
return lltype.malloc(STRUCT, flavor='raw', zero=zero,
- add_memory_pressure=add_memory_pressure,
track_allocation=track_allocation)
return _ll_0_raw_malloc_fixedsize
return build_ll_0_raw_malloc_fixedsize
@@ -641,18 +629,10 @@
build_raw_malloc_fixedsize_builder())
build_ll_0_raw_malloc_fixedsize_zero = (
build_raw_malloc_fixedsize_builder(zero=True))
- build_ll_0_raw_malloc_fixedsize_zero_add_memory_pressure = (
- build_raw_malloc_fixedsize_builder(zero=True, add_memory_pressure=True))
- build_ll_0_raw_malloc_fixedsize_add_memory_pressure = (
- build_raw_malloc_fixedsize_builder(add_memory_pressure=True))
build_ll_0_raw_malloc_fixedsize_no_track_allocation = (
build_raw_malloc_fixedsize_builder(track_allocation=False))
build_ll_0_raw_malloc_fixedsize_zero_no_track_allocation = (
build_raw_malloc_fixedsize_builder(zero=True, track_allocation=False))
- build_ll_0_raw_malloc_fixedsize_zero_add_memory_pressure_no_track_allocation = (
- build_raw_malloc_fixedsize_builder(zero=True, add_memory_pressure=True, track_allocation=False))
- build_ll_0_raw_malloc_fixedsize_add_memory_pressure_no_track_allocation = (
- build_raw_malloc_fixedsize_builder(add_memory_pressure=True, track_allocation=False))
def build_raw_free_builder(track_allocation=True):
def build_ll_1_raw_free(ARRAY):
diff --git a/pypy/rlib/rgc.py b/pypy/rlib/rgc.py
--- a/pypy/rlib/rgc.py
+++ b/pypy/rlib/rgc.py
@@ -261,21 +261,24 @@
except Exception:
return False # don't keep objects whose _freeze_() method explodes
-def add_memory_pressure(estimate):
- """Add memory pressure for OpaquePtrs."""
+def add_memory_pressure(owner, estimate):
+ """Add memory pressure for OpaquePtrs. Owner is either None or typically
+ the object which owns the reference (the one that would free it on __del__)
+ """
pass
class AddMemoryPressureEntry(ExtRegistryEntry):
_about_ = add_memory_pressure
- def compute_result_annotation(self, s_nbytes):
+ def compute_result_annotation(self, s_owner, s_nbytes):
from pypy.annotation import model as annmodel
return annmodel.s_None
def specialize_call(self, hop):
- [v_size] = hop.inputargs(lltype.Signed)
+ [v_owner, v_size] = hop.inputargs(hop.args_r[0], lltype.Signed)
hop.exception_cannot_occur()
- return hop.genop('gc_add_memory_pressure', [v_size],
+ v_owner_addr = hop.genop('cast_ptr_to_adr', [v_owner], resulttype=llmemory.Address)
+ return hop.genop('gc_add_memory_pressure', [v_owner_addr, v_size],
resulttype=lltype.Void)
diff --git a/pypy/rpython/lltypesystem/lltype.py b/pypy/rpython/lltypesystem/lltype.py
--- a/pypy/rpython/lltypesystem/lltype.py
+++ b/pypy/rpython/lltypesystem/lltype.py
@@ -1967,7 +1967,7 @@
def malloc(T, n=None, flavor='gc', immortal=False, zero=False,
- track_allocation=True, add_memory_pressure=False):
+ track_allocation=True):
assert flavor in ('gc', 'raw')
if zero or immortal:
initialization = 'example'
diff --git a/pypy/rpython/memory/gc/minimark.py b/pypy/rpython/memory/gc/minimark.py
--- a/pypy/rpython/memory/gc/minimark.py
+++ b/pypy/rpython/memory/gc/minimark.py
@@ -739,7 +739,7 @@
if self.max_heap_size < self.next_major_collection_threshold:
self.next_major_collection_threshold = self.max_heap_size
- def raw_malloc_memory_pressure(self, sizehint):
+ def raw_malloc_memory_pressure(self, obj, sizehint):
self.next_major_collection_threshold -= sizehint
if self.next_major_collection_threshold < 0:
# cannot trigger a full collection now, but we can ensure
diff --git a/pypy/rpython/memory/gc/test/test_direct.py b/pypy/rpython/memory/gc/test/test_direct.py
--- a/pypy/rpython/memory/gc/test/test_direct.py
+++ b/pypy/rpython/memory/gc/test/test_direct.py
@@ -593,6 +593,10 @@
addr_byte = self.gc.get_card(addr_dst, 0)
assert ord(addr_byte.char[0]) == 0x01 | 0x04 # bits 0 and 2
+ def test_memory_pressure(self):
+
+
+
test_writebarrier_before_copy_preserving_cards.GC_PARAMS = {
"card_page_indices": 4}
diff --git a/pypy/rpython/memory/gctransform/framework.py b/pypy/rpython/memory/gctransform/framework.py
--- a/pypy/rpython/memory/gctransform/framework.py
+++ b/pypy/rpython/memory/gctransform/framework.py
@@ -377,21 +377,12 @@
self.malloc_varsize_nonmovable_ptr = None
if getattr(GCClass, 'raw_malloc_memory_pressure', False):
- def raw_malloc_memory_pressure_varsize(length, itemsize):
- totalmem = length * itemsize
- if totalmem > 0:
- gcdata.gc.raw_malloc_memory_pressure(totalmem)
- #else: probably an overflow -- the following rawmalloc
- # will fail then
- def raw_malloc_memory_pressure(sizehint):
- gcdata.gc.raw_malloc_memory_pressure(sizehint)
- self.raw_malloc_memory_pressure_varsize_ptr = getfn(
- raw_malloc_memory_pressure_varsize,
- [annmodel.SomeInteger(), annmodel.SomeInteger()],
- annmodel.s_None, minimal_transform = False)
+ malloc_memory_pressure = func_with_new_name(
+ GCClass.raw_malloc_memory_pressure.im_func,
+ 'raw_malloc_memory_pressure')
self.raw_malloc_memory_pressure_ptr = getfn(
- raw_malloc_memory_pressure,
- [annmodel.SomeInteger()],
+ malloc_memory_pressure,
+ [s_gc, annmodel.SomeAddress(), annmodel.SomeInteger(nonneg=True)],
annmodel.s_None, minimal_transform = False)
diff --git a/pypy/rpython/memory/gctransform/transform.py b/pypy/rpython/memory/gctransform/transform.py
--- a/pypy/rpython/memory/gctransform/transform.py
+++ b/pypy/rpython/memory/gctransform/transform.py
@@ -560,10 +560,9 @@
def gct_gc_add_memory_pressure(self, hop):
if hasattr(self, 'raw_malloc_memory_pressure_ptr'):
op = hop.spaceop
- size = op.args[0]
return hop.genop("direct_call",
[self.raw_malloc_memory_pressure_ptr,
- size])
+ self.c_const_gc, op.args[0], op.args[1]])
def varsize_malloc_helper(self, hop, flags, meth, extraargs):
def intconst(c): return rmodel.inputconst(lltype.Signed, c)
@@ -595,11 +594,6 @@
def gct_fv_raw_malloc_varsize(self, hop, flags, TYPE, v_length, c_const_size, c_item_size,
c_offset_to_length):
- if flags.get('add_memory_pressure', False):
- if hasattr(self, 'raw_malloc_memory_pressure_varsize_ptr'):
- hop.genop("direct_call",
- [self.raw_malloc_memory_pressure_varsize_ptr,
- v_length, c_item_size])
if c_offset_to_length is None:
if flags.get('zero'):
fnptr = self.raw_malloc_varsize_no_length_zero_ptr
diff --git a/pypy/rpython/rbuiltin.py b/pypy/rpython/rbuiltin.py
--- a/pypy/rpython/rbuiltin.py
+++ b/pypy/rpython/rbuiltin.py
@@ -341,17 +341,15 @@
BUILTIN_TYPER[object.__init__] = rtype_object__init__
# annotation of low-level types
-def rtype_malloc(hop, i_flavor=None, i_zero=None, i_track_allocation=None,
- i_add_memory_pressure=None):
+def rtype_malloc(hop, i_flavor=None, i_zero=None, i_track_allocation=None):
assert hop.args_s[0].is_constant()
vlist = [hop.inputarg(lltype.Void, arg=0)]
opname = 'malloc'
- v_flavor, v_zero, v_track_allocation, v_add_memory_pressure = parse_kwds(
+ v_flavor, v_zero, v_track_allocation = parse_kwds(
hop,
(i_flavor, lltype.Void),
(i_zero, None),
- (i_track_allocation, None),
- (i_add_memory_pressure, None))
+ (i_track_allocation, None))
flags = {'flavor': 'gc'}
if v_flavor is not None:
@@ -360,8 +358,6 @@
flags['zero'] = v_zero.value
if i_track_allocation is not None:
flags['track_allocation'] = v_track_allocation.value
- if i_add_memory_pressure is not None:
- flags['add_memory_pressure'] = v_add_memory_pressure.value
vlist.append(hop.inputconst(lltype.Void, flags))
assert 1 <= hop.nb_args <= 2
diff --git a/pypy/translator/c/test/test_newgc.py b/pypy/translator/c/test/test_newgc.py
--- a/pypy/translator/c/test/test_newgc.py
+++ b/pypy/translator/c/test/test_newgc.py
@@ -1451,8 +1451,9 @@
ARRAY = rffi.CArray(rffi.INT)
class A:
def __init__(self, n):
- self.buf = lltype.malloc(ARRAY, n, flavor='raw',
- add_memory_pressure=True)
+ self.buf = lltype.malloc(ARRAY, n, flavor='raw')
+ rgc.add_memory_pressure(self, n * rffi.sizeof(ARRAY.OF))
+
def __del__(self):
lltype.free(self.buf, flavor='raw')
A(6)
@@ -1486,7 +1487,7 @@
flavor='raw')
digest = ropenssl.EVP_get_digestbyname('sha1')
ropenssl.EVP_DigestInit(self.ctx, digest)
- rgc.add_memory_pressure(HASH_MALLOC_SIZE + 64)
+ rgc.add_memory_pressure(self, HASH_MALLOC_SIZE + 64)
def __del__(self):
ropenssl.EVP_MD_CTX_cleanup(self.ctx)
More information about the pypy-commit
mailing list