[pypy-commit] pypy cpyext-gc-cycle: Cleaned up code in incminimark
stevie_92
pypy.commits at gmail.com
Fri Jan 11 05:39:20 EST 2019
Author: Stefan Beyer <home at sbeyer.at>
Branch: cpyext-gc-cycle
Changeset: r95612:5b3e2b3a25bf
Date: 2018-08-24 09:17 +0200
http://bitbucket.org/pypy/pypy/changeset/5b3e2b3a25bf/
Log: Cleaned up code in incminimark
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
@@ -3030,9 +3030,6 @@
self.rrc_dealloc_trigger_callback = dealloc_trigger_callback
self.rrc_dealloc_pending = self.AddressStack()
self.rrc_tp_traverse = tp_traverse
- self.rrc_pyobjects_to_scan = self.AddressStack()
- self.rrc_more_pyobjects_to_scan = self.AddressStack()
- self.rrc_pyobjects_to_trace = self.AddressStack()
self.rrc_pyobj_list = self._pygchdr(pyobj_list)
self.rrc_gc_as_pyobj = gc_as_pyobj
self.rrc_pyobj_as_gc = pyobj_as_gc
@@ -3205,16 +3202,8 @@
self._pyobj(pyobject).c_ob_refcnt = rc
_rrc_free._always_inline_ = True
- NO_CYCLE_DETECTION = False
-
def rrc_major_collection_trace(self):
- debug_start("gc-rrc-trace")
- if self.NO_CYCLE_DETECTION:
- self.rrc_p_list_old.foreach(self._rrc_major_trace, None)
- else:
- self.rrc_major_collection_trace_cycle()
- self.rrc_p_list_old.foreach(self._rrc_major_trace, None) # for now, remove later
- debug_stop("gc-rrc-trace")
+ self.rrc_p_list_old.foreach(self._rrc_major_trace, None)
def _rrc_major_trace(self, pyobject, ignore):
from rpython.rlib.rawrefcount import REFCNT_FROM_PYPY
@@ -3230,77 +3219,6 @@
self.objects_to_trace.append(obj)
self.visit_all_objects()
- def rrc_major_collection_trace_cycle(self):
- assert not self.objects_to_trace.non_empty()
- assert not self.rrc_pyobjects_to_scan.non_empty()
- assert not self.rrc_more_pyobjects_to_scan.non_empty()
- assert not self.rrc_pyobjects_to_trace.non_empty()
-
- self._rrc_gc_print_list()
-
- # initially, scan all real pyobjects (not proxies) which are linked to objects
- #self.rrc_p_list_old.foreach(self._rrc_major_scan_non_rc_roots, None)
- self.rrc_o_list_old.foreach(self._rrc_major_scan_non_rc_roots, None)
-
- # as long as we find new pyobjects which should be marked, recursively
- # mark them
- while self.rrc_pyobjects_to_trace.non_empty():
- while self.rrc_pyobjects_to_trace.non_empty():
- pyobject = self.rrc_pyobjects_to_trace.pop()
- self._rrc_traverse(pyobject)
-
- # see if we found new pypy objects to trace
- if self.objects_to_trace.non_empty():
- self.visit_all_objects()
- self.objects_to_trace.delete()
- self.objects_to_trace = self.AddressStack()
-
- # look if there are some pyobjects with linked objects which were
- # not marked previously, but are marked now
- swap = self.rrc_pyobjects_to_scan
- self.rrc_pyobjects_to_scan = self.rrc_more_pyobjects_to_scan
- self.rrc_more_pyobjects_to_scan = swap
- self.rrc_pyobjects_to_scan.foreach(
- self._rrc_major_scan_non_rc_roots, None)
- self.rrc_pyobjects_to_scan.delete()
- self.rrc_pyobjects_to_scan = self.AddressStack()
-
- self.rrc_more_pyobjects_to_scan.delete()
- self.rrc_more_pyobjects_to_scan = self.AddressStack()
-
- def _rrc_mark_cpyobj(self, pyobj):
- # if the pyobj is not marked, remember it and if there is a linked pypy
- # object also remember it
- visited = True # TODO: check if visited (via 'cast' to PyGC_Head)
- if not visited:
- # TODO: mark visited
- pyobject = llmemory.cast_ptr_to_adr(pyobj)
- self.rrc_more_pyobjects_to_scan.append(pyobject)
- intobj = pyobj.c_ob_pypy_link
- if intobj != 0:
- obj = llmemory.cast_int_to_adr(intobj)
- hdr = self.header(obj)
- if not (hdr.tid & GCFLAG_VISITED):
- self.objects_to_trace.append(obj)
-
- def _rrc_major_scan_non_rc_roots(self, pyobject, ignore):
- # check in the object header of the linked pypy object, if it is marked
- # or not
- pyobj = self._pyobj(pyobject)
- intobj = pyobj.c_ob_pypy_link
- obj = llmemory.cast_int_to_adr(intobj)
- hdr = self.header(obj)
- if hdr.tid & GCFLAG_VISITED:
- visited = True # TODO: check if visited
- if not visited:
- # process the pyobject now
- # TODO: mark visited
- self.rrc_pyobjects_to_trace.append(pyobject)
- else:
- # save the pyobject for later, in case its linked object becomes
- # marked
- self.rrc_more_pyobjects_to_scan.append(pyobject)
-
def rrc_major_collection_free(self):
ll_assert(self.rrc_p_dict_nurs.length() == 0, "p_dict_nurs not empty 2")
length_estimate = self.rrc_p_dict.length()
@@ -3335,13 +3253,15 @@
else:
self._rrc_free(pyobject)
+ def _rrc_visit_pyobj(self, pyobj):
+ pass
+
def _rrc_visit(pyobj, self_ptr):
from rpython.rtyper.annlowlevel import cast_adr_to_nongc_instance
#
- debug_print("visit called!")
self_adr = rffi.cast(llmemory.Address, self_ptr)
self = cast_adr_to_nongc_instance(IncrementalMiniMarkGC, self_adr)
- self._rrc_mark_cpyobj(pyobj)
+ self._rrc_visit_pyobj(pyobj)
return rffi.cast(rffi.INT_real, 0)
def _rrc_traverse(self, pyobject):
@@ -3357,13 +3277,3 @@
def _rrc_gc_list_init(self, pygclist):
pygclist.c_gc_next = pygclist
pygclist.c_gc_prev = pygclist
-
- def _rrc_gc_print_list(self):
- debug_print("gc_print_list start!")
- curr = self.rrc_pyobj_list.c_gc_next
- while curr != self.rrc_pyobj_list:
- currobj = self.rrc_gc_as_pyobj(curr)
- curr2 = self.rrc_pyobj_as_gc(currobj)
- debug_print("gc_print_list: ", curr, ", obj:", currobj, ", curr: ",
- curr2)
- curr = curr.c_gc_next
More information about the pypy-commit
mailing list