[pypy-commit] pypy memory-accounting: (arigo, fijal) start a new branch that tries to account better for tracked memory
fijal
pypy.commits at gmail.com
Wed Sep 27 13:11:55 EDT 2017
Author: fijal
Branch: memory-accounting
Changeset: r92479:336c50a8852e
Date: 2017-09-27 19:11 +0200
http://bitbucket.org/pypy/pypy/changeset/336c50a8852e/
Log: (arigo, fijal) start a new branch that tries to account better for
tracked memory
diff --git a/rpython/memory/gc/incminimark.py b/rpython/memory/gc/incminimark.py
--- a/rpython/memory/gc/incminimark.py
+++ b/rpython/memory/gc/incminimark.py
@@ -1023,7 +1023,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, sizehint, adr):
# Decrement by 'sizehint' plus a very little bit extra. This
# is needed e.g. for _rawffi, which may allocate a lot of tiny
# arrays.
diff --git a/rpython/memory/gc/minimark.py b/rpython/memory/gc/minimark.py
--- a/rpython/memory/gc/minimark.py
+++ b/rpython/memory/gc/minimark.py
@@ -828,7 +828,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, sizehint, adr):
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/rpython/memory/gctransform/framework.py b/rpython/memory/gctransform/framework.py
--- a/rpython/memory/gctransform/framework.py
+++ b/rpython/memory/gctransform/framework.py
@@ -392,21 +392,22 @@
inline = True)
if getattr(GCClass, 'raw_malloc_memory_pressure', False):
- def raw_malloc_memory_pressure_varsize(length, itemsize):
+ def raw_malloc_memory_pressure_varsize(length, itemsize, adr):
totalmem = length * itemsize
if totalmem > 0:
- gcdata.gc.raw_malloc_memory_pressure(totalmem)
+ gcdata.gc.raw_malloc_memory_pressure(totalmem, adr)
#else: probably an overflow -- the following rawmalloc
# will fail then
- def raw_malloc_memory_pressure(sizehint):
- gcdata.gc.raw_malloc_memory_pressure(sizehint)
+ def raw_malloc_memory_pressure(sizehint, adr):
+ gcdata.gc.raw_malloc_memory_pressure(sizehint, adr)
self.raw_malloc_memory_pressure_varsize_ptr = getfn(
raw_malloc_memory_pressure_varsize,
- [annmodel.SomeInteger(), annmodel.SomeInteger()],
+ [annmodel.SomeInteger(), annmodel.SomeInteger(),
+ SomeAddress()],
annmodel.s_None, minimal_transform = False)
self.raw_malloc_memory_pressure_ptr = getfn(
raw_malloc_memory_pressure,
- [annmodel.SomeInteger()],
+ [annmodel.SomeInteger(), SomeAddress()],
annmodel.s_None, minimal_transform = False)
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
@@ -538,9 +538,14 @@
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])
+ [self.raw_malloc_memory_pressure_ptr,
+ size, v_adr])
def varsize_malloc_helper(self, hop, flags, meth, extraargs):
def intconst(c): return rmodel.inputconst(lltype.Signed, c)
@@ -574,9 +579,10 @@
c_offset_to_length):
if flags.get('add_memory_pressure', False):
if hasattr(self, 'raw_malloc_memory_pressure_varsize_ptr'):
+ v_adr = rmodel.inputconst(llmemory.Address, llmemory.NULL)
hop.genop("direct_call",
[self.raw_malloc_memory_pressure_varsize_ptr,
- v_length, c_item_size])
+ v_length, c_item_size, v_adr])
if c_offset_to_length is None:
if flags.get('zero'):
fnptr = self.raw_malloc_varsize_no_length_zero_ptr
diff --git a/rpython/memory/gcwrapper.py b/rpython/memory/gcwrapper.py
--- a/rpython/memory/gcwrapper.py
+++ b/rpython/memory/gcwrapper.py
@@ -83,9 +83,9 @@
def gettypeid(self, obj):
return self.get_type_id(lltype.typeOf(obj).TO)
- def add_memory_pressure(self, size):
+ def add_memory_pressure(self, size, adr):
if hasattr(self.gc, 'raw_malloc_memory_pressure'):
- self.gc.raw_malloc_memory_pressure(size)
+ self.gc.raw_malloc_memory_pressure(size, adr)
def shrink_array(self, p, smallersize):
if hasattr(self.gc, 'shrink_array'):
diff --git a/rpython/rlib/rgc.py b/rpython/rlib/rgc.py
--- a/rpython/rlib/rgc.py
+++ b/rpython/rlib/rgc.py
@@ -598,21 +598,26 @@
return False
return type(x).__module__ != '__builtin__' # keep non-builtins
-def add_memory_pressure(estimate):
+def add_memory_pressure(estimate, object=None):
"""Add memory pressure for OpaquePtrs."""
pass
class AddMemoryPressureEntry(ExtRegistryEntry):
_about_ = add_memory_pressure
- def compute_result_annotation(self, s_nbytes):
+ def compute_result_annotation(self, s_nbytes, s_object=None):
from rpython.annotator import model as annmodel
return annmodel.s_None
def specialize_call(self, hop):
- [v_size] = hop.inputargs(lltype.Signed)
+ v_size = hop.inputarg(lltype.Signed, 0)
+ if len(hop.args_v) == 2:
+ v_obj = hop.inputarg(hop.args_r[1], 1)
+ args = [v_size, v_obj]
+ else:
+ args = [v_size]
hop.exception_cannot_occur()
- return hop.genop('gc_add_memory_pressure', [v_size],
+ return hop.genop('gc_add_memory_pressure', args,
resulttype=lltype.Void)
diff --git a/rpython/translator/c/test/test_newgc.py b/rpython/translator/c/test/test_newgc.py
--- a/rpython/translator/c/test/test_newgc.py
+++ b/rpython/translator/c/test/test_newgc.py
@@ -1613,7 +1613,7 @@
digest = ropenssl.EVP_get_digestbyname('sha1')
self.ctx = ropenssl.EVP_MD_CTX_new()
ropenssl.EVP_DigestInit(self.ctx, digest)
- rgc.add_memory_pressure(ropenssl.HASH_MALLOC_SIZE + 64)
+ rgc.add_memory_pressure(ropenssl.HASH_MALLOC_SIZE + 64, self)
def __del__(self):
ropenssl.EVP_MD_CTX_free(self.ctx)
More information about the pypy-commit
mailing list