Author: Antonio Cuni <[email protected]>
Branch: gc-hooks
Changeset: r94183:5fbf8b32c70c
Date: 2018-03-29 10:45 +0200
http://bitbucket.org/pypy/pypy/changeset/5fbf8b32c70c/
Log: add a hook for gc-collect-done
diff --git a/rpython/memory/gc/hook.py b/rpython/memory/gc/hook.py
--- a/rpython/memory/gc/hook.py
+++ b/rpython/memory/gc/hook.py
@@ -4,3 +4,10 @@
"""
Called after a minor collection
"""
+
+ def on_gc_collect(self, count, arenas_count_before, arenas_count_after,
+ arenas_bytes, rawmalloc_bytes_before,
+ rawmalloc_bytes_after):
+ """
+ Called after a major collection is fully done
+ """
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
@@ -2422,6 +2422,13 @@
self.stat_rawmalloced_total_size, " => ",
self.rawmalloced_total_size)
debug_stop("gc-collect-done")
+ self.hooks.on_gc_collect(
+ count=self.num_major_collects,
+ arenas_count_before=self.stat_ac_arenas_count,
+ arenas_count_after=self.ac.arenas_count,
+ arenas_bytes=self.ac.total_memory_used,
+ rawmalloc_bytes_before=self.stat_rawmalloced_total_size,
+ rawmalloc_bytes_after=self.rawmalloced_total_size)
#
# Set the threshold for the next major collection to be when we
# have allocated 'major_collection_threshold' times more than
diff --git a/rpython/memory/gc/test/test_hook.py
b/rpython/memory/gc/test/test_hook.py
--- a/rpython/memory/gc/test/test_hook.py
+++ b/rpython/memory/gc/test/test_hook.py
@@ -9,10 +9,14 @@
def reset(self):
self.minors = []
+ self.collects = []
def on_gc_minor(self, **kwds):
self.minors.append(kwds)
+ def on_gc_collect(self, **kwds):
+ self.collects.append(kwds)
+
class TestIncMiniMarkHooks(BaseDirectGCTest):
from rpython.memory.gc.incminimark import IncrementalMiniMarkGC as GCClass
@@ -20,6 +24,11 @@
def get_extra_gc_params(self):
return {'hooks': MyGcHooks()}
+ def setup_method(self, m):
+ BaseDirectGCTest.setup_method(self, m)
+ size = llmemory.sizeof(S) + self.gc.gcheaderbuilder.size_gc_header
+ self.size_of_S = llmemory.raw_malloc_usage(size)
+
def test_on_gc_minor(self):
self.malloc(S)
self.gc._minor_collection()
@@ -31,9 +40,31 @@
# these objects survive, so the total_memory_used is > 0
self.stackroots.append(self.malloc(S))
self.stackroots.append(self.malloc(S))
- size = llmemory.sizeof(S) + self.gc.gcheaderbuilder.size_gc_header
- rawsize = llmemory.raw_malloc_usage(size)
self.gc._minor_collection()
assert self.gc.hooks.minors == [
- {'total_memory_used': rawsize*2, 'pinned_objects': 0}
+ {'total_memory_used': self.size_of_S*2, 'pinned_objects': 0}
]
+
+ def test_on_gc_collect(self):
+ self.malloc(S)
+ self.gc.collect()
+ assert self.gc.hooks.collects == [
+ {'count': 1,
+ 'arenas_count_before': 0,
+ 'arenas_count_after': 0,
+ 'arenas_bytes': 0,
+ 'rawmalloc_bytes_after': 0,
+ 'rawmalloc_bytes_before': 0}
+ ]
+ self.gc.hooks.reset()
+ #
+ self.stackroots.append(self.malloc(S))
+ self.gc.collect()
+ assert self.gc.hooks.collects == [
+ {'count': 2,
+ 'arenas_count_before': 1,
+ 'arenas_count_after': 1,
+ 'arenas_bytes': self.size_of_S,
+ 'rawmalloc_bytes_after': 0,
+ 'rawmalloc_bytes_before': 0}
+ ]
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit