[pypy-commit] pypy quad-color-gc: Update qcgc codebase

ntruessel pypy.commits at gmail.com
Thu Sep 15 17:10:51 EDT 2016


Author: Nicolas Truessel <ntruessel at njsm.de>
Branch: quad-color-gc
Changeset: r87125:a4672aa11b87
Date: 2016-09-13 22:20 +0200
http://bitbucket.org/pypy/pypy/changeset/a4672aa11b87/

Log:	Update qcgc codebase

diff --git a/rpython/translator/c/src/qcgc/config.h b/rpython/translator/c/src/qcgc/config.h
--- a/rpython/translator/c/src/qcgc/config.h
+++ b/rpython/translator/c/src/qcgc/config.h
@@ -31,8 +31,8 @@
 /**
  * Auto Mark/Collect
  */
-#define QCGC_MAJOR_COLLECTION_THRESHOLD (5 * (1<<QCGC_ARENA_SIZE_EXP))
 #define QCGC_INCMARK_THRESHOLD (1<<QCGC_ARENA_SIZE_EXP)
+#define QCGC_INCMARK_TO_SWEEP 5
 
 /**
  * DO NOT MODIFY BELOW HERE
diff --git a/rpython/translator/c/src/qcgc/qcgc.c b/rpython/translator/c/src/qcgc/qcgc.c
--- a/rpython/translator/c/src/qcgc/qcgc.c
+++ b/rpython/translator/c/src/qcgc/qcgc.c
@@ -32,18 +32,18 @@
 	qcgc_state.gp_gray_stack = qcgc_gray_stack_create(16); // XXX
 	qcgc_state.gray_stack_size = 0;
 	qcgc_state.phase = GC_PAUSE;
-	qcgc_state.bytes_since_collection = 0;
 	qcgc_state.bytes_since_incmark = 0;
+	qcgc_state.incmark_since_sweep = 0;
 	qcgc_state.free_cells = 0;
 	qcgc_state.largest_free_block = 0;
 	qcgc_allocator_initialize();
 	qcgc_hbtable_initialize();
 	qcgc_event_logger_initialize();
 
-	env_or_fallback(qcgc_state.major_collection_threshold,
-			"QCGC_MAJOR_COLLECTION", QCGC_MAJOR_COLLECTION_THRESHOLD);
 	env_or_fallback(qcgc_state.incmark_threshold,
 			"QCGC_INCMARK", QCGC_INCMARK_THRESHOLD);
+	env_or_fallback(qcgc_state.incmark_to_sweep,
+			"QCGC_INCMARK_TO_SWEEP", QCGC_INCMARK_TO_SWEEP);
 
 	setup_signal_handler();
 }
@@ -65,15 +65,18 @@
 #endif
 	object_t *result;
 
-	if (qcgc_state.bytes_since_collection >
-			qcgc_state.major_collection_threshold) {
-		qcgc_collect();
-	}
-	if (qcgc_state.bytes_since_incmark > qcgc_state.incmark_threshold) {
-		qcgc_incmark();
+	if (UNLIKELY(qcgc_state.bytes_since_incmark >
+				qcgc_state.incmark_threshold)) {
+		if (qcgc_state.incmark_since_sweep == qcgc_state.incmark_to_sweep) {
+			qcgc_collect();
+		} else {
+			qcgc_incmark();
+			qcgc_state.incmark_since_sweep++;
+		}
+		
 	}
 
-	if (size <= 1<<QCGC_LARGE_ALLOC_THRESHOLD_EXP) {
+	if (LIKELY(size <= 1<<QCGC_LARGE_ALLOC_THRESHOLD_EXP)) {
 		// Use bump / fit allocator
 		//if (qcgc_allocator_state.use_bump_allocator) {
 		if (true) {
@@ -92,7 +95,6 @@
 	}
 
 	// XXX: Should we use cells instead of bytes?
-	qcgc_state.bytes_since_collection += size;
 	qcgc_state.bytes_since_incmark += size;
 
 
@@ -106,7 +108,7 @@
 void qcgc_collect(void) {
 	qcgc_mark();
 	qcgc_sweep();
-	qcgc_state.bytes_since_collection = 0;
+	qcgc_state.incmark_since_sweep = 0;
 }
 
 void qcgc_write(object_t *object) {
diff --git a/rpython/translator/c/src/qcgc/src/gc_state.h b/rpython/translator/c/src/qcgc/src/gc_state.h
--- a/rpython/translator/c/src/qcgc/src/gc_state.h
+++ b/rpython/translator/c/src/qcgc/src/gc_state.h
@@ -33,10 +33,10 @@
 	size_t gray_stack_size;
 	gc_phase_t phase;
 
-	size_t bytes_since_collection;
 	size_t bytes_since_incmark;
-	size_t major_collection_threshold;
+	size_t incmark_since_sweep;
 	size_t incmark_threshold;
+	size_t incmark_to_sweep;
 
 	size_t free_cells;			// Overall amount of free cells without huge
 								// blocks and free areans. Valid right after sweep


More information about the pypy-commit mailing list