[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