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) _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit