Author: Andrew Chambers <[email protected]>
Branch: incremental-gc
Changeset: r66007:fb31aa0383a3
Date: 2013-08-08 17:37 +1200
http://bitbucket.org/pypy/pypy/changeset/fb31aa0383a3/
Log: partially changed sweeping to incremental
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
@@ -138,8 +138,9 @@
#XXX describe
# marking of objects can be done over multiple
STATE_MARKING = 1
-STATE_SWEEPING = 2
-STATE_FINALIZING = 3
+STATE_SWEEPING_RAWMALLOC = 2
+STATE_SWEEPING_ARENA = 3
+STATE_FINALIZING = 4
@@ -1684,16 +1685,19 @@
if self.old_objects_with_light_finalizers.non_empty():
self.deal_with_old_objects_with_finalizers()
#objects_to_trace processed fully, can move on to sweeping
- self.gc_state = STATE_SWEEPING
-
- #SWEEPING not yet incrementalised
- self.major_collection_step(reserving_size)
+ self.gc_state = STATE_SWEEPING_RAWMALLOC
+ self.start_free_rawmalloc_objects()
#END MARKING
- elif self.gc_state == STATE_SWEEPING:
+ elif self.gc_state == STATE_SWEEPING_RAWMALLOC:
#
# Walk all rawmalloced objects and free the ones that don't
# have the GCFLAG_VISITED flag.
- self.free_unvisited_rawmalloc_objects()
+ # XXX heuristic here?
+ if self.free_unvisited_rawmalloc_objects_step(1):
+ self.gc_state = STATE_SWEEPING_ARENA
+
+ elif self.gc_state == STATE_SWEEPING_ARENA:
+
#
# Ask the ArenaCollection to visit all objects. Free the ones
# that have not been visited above, and reset GCFLAG_VISITED on
@@ -1804,15 +1808,22 @@
#
llarena.arena_free(arena)
self.rawmalloced_total_size -= r_uint(allocsize)
-
- def free_unvisited_rawmalloc_objects(self):
- list = self.old_rawmalloced_objects
+
+ def start_free_rawmalloc_objects(self):
+ self.raw_malloc_might_sweep = self.old_rawmalloced_objects
self.old_rawmalloced_objects = self.AddressStack()
- #
- while list.non_empty():
- self.free_rawmalloced_object_if_unvisited(list.pop())
- #
- list.delete()
+
+ # Returns true when finished processing objects
+ def free_unvisited_rawmalloc_objects_step(self,nobjects=1):
+
+ while nobjects > 0 and self.raw_malloc_might_sweep.non_empty():
+ self.free_rawmalloced_object_if_unvisited(
+ self.raw_malloc_might_sweep.pop())
+
+ if not self.raw_malloc_might_sweep.non_empty():
+ self.raw_malloc_might_sweep.delete()
+ return True
+ return False
def collect_roots(self):
_______________________________________________
pypy-commit mailing list
[email protected]
http://mail.python.org/mailman/listinfo/pypy-commit