[pypy-commit] pypy memory-accounting: write the number of raw malloced bytes into structs that are used for add_memory_pressure

fijal pypy.commits at gmail.com
Thu Sep 28 11:55:30 EDT 2017


Author: fijal
Branch: memory-accounting
Changeset: r92489:238b67adb061
Date: 2017-09-28 17:54 +0200
http://bitbucket.org/pypy/pypy/changeset/238b67adb061/

Log:	write the number of raw malloced bytes into structs that are used
	for add_memory_pressure

diff --git a/rpython/annotator/bookkeeper.py b/rpython/annotator/bookkeeper.py
--- a/rpython/annotator/bookkeeper.py
+++ b/rpython/annotator/bookkeeper.py
@@ -71,6 +71,7 @@
 
         self.needs_generic_instantiate = {}
         self.thread_local_fields = set()
+        self.memory_pressure_types = set()
 
         self.register_builtins()
 
diff --git a/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -832,6 +832,22 @@
 
     gct_fv_gc_malloc_varsize = gct_fv_gc_malloc
 
+    def gct_gc_add_memory_pressure(self, hop):
+        if hasattr(self, 'raw_malloc_memory_pressure_ptr'):
+            op = hop.spaceop
+            size = op.args[0]
+            if len(op.args) == 2:
+                v_fld = rmodel.inputconst(lltype.Void, "special_memory_pressure")
+                hop.genop("bare_setfield", [op.args[1], v_fld, size])
+                v_adr = hop.genop("cast_ptr_to_adr", [op.args[1]],
+                    resulttype=llmemory.Address)
+            else:
+                v_adr = rmodel.inputconst(llmemory.Address, llmemory.NULL)
+            return hop.genop("direct_call",
+                              [self.raw_malloc_memory_pressure_ptr,
+                               size, v_adr])
+
+
     def gct_gc__collect(self, hop):
         op = hop.spaceop
         if len(op.args) == 1:
diff --git a/rpython/memory/gctransform/transform.py b/rpython/memory/gctransform/transform.py
--- a/rpython/memory/gctransform/transform.py
+++ b/rpython/memory/gctransform/transform.py
@@ -535,17 +535,7 @@
         return self.varsize_malloc_helper(hop, flags, meth, [])
 
     def gct_gc_add_memory_pressure(self, hop):
-        if hasattr(self, 'raw_malloc_memory_pressure_ptr'):
-            op = hop.spaceop
-            size = op.args[0]
-            if len(op.args) == 2:
-                v_adr = hop.genop("cast_ptr_to_adr", [op.args[1]],
-                    resulttype=llmemory.Address)
-            else:
-                v_adr = rmodel.inputconst(llmemory.Address, llmemory.NULL)
-            return hop.genop("direct_call",
-                              [self.raw_malloc_memory_pressure_ptr,
-                               size, v_adr])
+        pass
 
     def varsize_malloc_helper(self, hop, flags, meth, extraargs):
         def intconst(c): return rmodel.inputconst(lltype.Signed, c)
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -607,6 +607,11 @@
 
     def compute_result_annotation(self, s_nbytes, s_object=None):
         from rpython.annotator import model as annmodel
+        if s_object is not None:
+            if not isinstance(s_object, annmodel.SomeInstance):
+                raise Exception("Wrong kind of object passed to "
+                                "add memory pressure")
+            self.bookkeeper.memory_pressure_types.add(s_object.classdef)
         return annmodel.s_None
 
     def specialize_call(self, hop):
diff --git a/rpython/rtyper/rclass.py b/rpython/rtyper/rclass.py
--- a/rpython/rtyper/rclass.py
+++ b/rpython/rtyper/rclass.py
@@ -523,6 +523,10 @@
                 if not attrdef.readonly and self.is_quasi_immutable(name):
                     llfields.append(('mutate_' + name, OBJECTPTR))
 
+            bookkeeper = self.rtyper.annotator.bookkeeper
+            if self.classdef in bookkeeper.memory_pressure_types:
+                llfields = [('special_memory_pressure', lltype.Signed)] + llfields
+
             object_type = MkStruct(self.classdef.name,
                                    ('super', self.rbase.object_type),
                                    hints=hints,


More information about the pypy-commit mailing list