Author: Antonio Cuni <[email protected]>
Branch: gc-disable
Changeset: r94634:48a6326917c6
Date: 2018-05-19 11:21 +0200
http://bitbucket.org/pypy/pypy/changeset/48a6326917c6/
Log: WIP: introduce IncrementalMiniMarkGC.{enable,disable}(): when the GC
is disabled, it runs only minor collections; major ones needs to be
explictly triggered
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
@@ -376,6 +376,11 @@
self.rawmalloced_peak_size = r_uint(0)
self.gc_state = STATE_SCANNING
+
+ # if the GC is disabled, it runs only minor collections; major
+ # collections need to be manually triggered by explicitly calling
+ # collect()
+ self.enabled = True
#
# Two lists of all objects with finalizers. Actually they are lists
# of pairs (finalization_queue_nr, object). "probably young objects"
@@ -511,6 +516,12 @@
bigobj = self.nonlarge_max + 1
self.max_number_of_pinned_objects = self.nursery_size / (bigobj *
2)
+ def enable(self):
+ self.enabled = True
+
+ def disable(self):
+ self.enabled = False
+
def _nursery_memory_size(self):
extra = self.nonlarge_max + 1
return self.nursery_size + extra
@@ -758,11 +769,14 @@
def minor_collection_with_major_progress(self, extrasize=0):
- """Do a minor collection. Then, if there is already a major GC
- in progress, run at least one major collection step. If there is
- no major GC but the threshold is reached, start a major GC.
+ """Do a minor collection. Then, if the GC is enabled and there
+ is already a major GC in progress, run at least one major collection
+ step. If there is no major GC but the threshold is reached, start a
+ major GC.
"""
self._minor_collection()
+ if not self.enabled:
+ return
# If the gc_state is STATE_SCANNING, we're not in the middle
# of an incremental major collection. In that case, wait
diff --git a/rpython/memory/gc/test/test_direct.py
b/rpython/memory/gc/test/test_direct.py
--- a/rpython/memory/gc/test/test_direct.py
+++ b/rpython/memory/gc/test/test_direct.py
@@ -13,6 +13,7 @@
from rpython.memory.gc import minimark, incminimark
from rpython.memory.gctypelayout import zero_gc_pointers_inside,
zero_gc_pointers
from rpython.rlib.debug import debug_print
+from rpython.rlib.test.test_debug import debuglog
import pdb
WORD = LONG_BIT // 8
@@ -770,4 +771,22 @@
assert elem.prev == lltype.nullptr(S)
assert elem.next == lltype.nullptr(S)
-
+ def test_enable_disable(self, debuglog):
+ def large_malloc():
+ # malloc an object which is large enough to trigger a major
collection
+ threshold = self.gc.next_major_collection_threshold
+ self.malloc(VAR, int(threshold/8))
+ summary = debuglog.summary()
+ debuglog.reset()
+ return summary
+ #
+ summary = large_malloc()
+ assert sorted(summary.keys()) == ['gc-collect-step', 'gc-minor']
+ #
+ self.gc.disable()
+ summary = large_malloc()
+ assert sorted(summary.keys()) == ['gc-minor']
+ #
+ self.gc.enable()
+ summary = large_malloc()
+ assert sorted(summary.keys()) == ['gc-collect-step', 'gc-minor']
_______________________________________________
pypy-commit mailing list
[email protected]
https://mail.python.org/mailman/listinfo/pypy-commit