Author: Antonio Cuni <anto.c...@gmail.com> Branch: gc-hooks Changeset: r94188:3d2b6d04026f Date: 2018-03-30 14:22 +0200 http://bitbucket.org/pypy/pypy/changeset/3d2b6d04026f/
Log: call the hooks through helpers which are marked as @rgc.no_collect, to ensure that we cannot allocate anything from within 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 @@ -1,10 +1,21 @@ +from rpython.rlib import rgc + class GcHooks(object): + """ + Base class to write your own GC hooks. + + Subclasses are expected to override the on_* methods. Note that such + methods can do only simple stuff such as updating statistics and/or + setting a flag: in particular, they cannot do anything which can possibly + trigger a GC collection. + """ def __init__(self): self.gc_minor_enabled = False self.gc_collect_step_enabled = False self.gc_collect_enabled = False + def on_gc_minor(self, total_memory_used, pinned_objects): """ Called after a minor collection @@ -20,9 +31,29 @@ incminimark.GC_STATES. """ + 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 """ + + # the fire_* methods are meant to be called from the GC are should NOT be + # overridden + + @rgc.no_collect + def fire_gc_minor(self, total_memory_used, pinned_objects): + self.on_gc_minor(total_memory_used, pinned_objects) + + @rgc.no_collect + def fire_gc_collect_step(self, oldstate, newstate): + self.on_gc_collect_step(oldstate, newstate) + + @rgc.no_collect + def fire_gc_collect(self, count, arenas_count_before, arenas_count_after, + arenas_bytes, rawmalloc_bytes_before, + rawmalloc_bytes_after): + self.on_gc_collect(count, arenas_count_before, arenas_count_after, + arenas_bytes, rawmalloc_bytes_before, + rawmalloc_bytes_after) 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 @@ -1839,7 +1839,7 @@ # debug_stop("gc-minor") if self.hooks.gc_minor_enabled: - self.hooks.on_gc_minor(total_memory_used=total_memory_used, + self.hooks.fire_gc_minor(total_memory_used=total_memory_used, pinned_objects=self.pinned_objects_in_nursery) def _reset_flag_old_objects_pointing_to_pinned(self, obj, ignore): @@ -2425,7 +2425,7 @@ self.rawmalloced_total_size) debug_stop("gc-collect-done") if self.hooks.gc_collect_enabled: - self.hooks.on_gc_collect( + self.hooks.fire_gc_collect( count=self.num_major_collects, arenas_count_before=self.stat_ac_arenas_count, arenas_count_after=self.ac.arenas_count, @@ -2484,7 +2484,7 @@ debug_print("stopping, now in gc state: ", GC_STATES[self.gc_state]) debug_stop("gc-collect-step") if self.hooks.gc_collect_step_enabled: - self.hooks.on_gc_collect_step(oldstate=oldstate, + self.hooks.fire_gc_collect_step(oldstate=oldstate, newstate=self.gc_state) def _sweep_old_objects_pointing_to_pinned(self, obj, new_list): _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit