[pypy-commit] pypy quad-color-gc: QCGC codebase update

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


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

Log:	QCGC codebase update

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
@@ -70,7 +70,7 @@
 		qcgc_collect();
 	}
 	if (qcgc_state.bytes_since_incmark > qcgc_state.incmark_threshold) {
-		qcgc_mark(true);
+		qcgc_incmark();
 	}
 
 	if (size <= 1<<QCGC_LARGE_ALLOC_THRESHOLD_EXP) {
@@ -104,7 +104,7 @@
 }
 
 void qcgc_collect(void) {
-	qcgc_mark(false);
+	qcgc_mark();
 	qcgc_sweep();
 	qcgc_state.bytes_since_collection = 0;
 }
diff --git a/rpython/translator/c/src/qcgc/src/collector.c b/rpython/translator/c/src/qcgc/src/collector.c
--- a/rpython/translator/c/src/qcgc/src/collector.c
+++ b/rpython/translator/c/src/qcgc/src/collector.c
@@ -9,8 +9,77 @@
 
 QCGC_STATIC QCGC_INLINE void qcgc_pop_object(object_t *object);
 QCGC_STATIC QCGC_INLINE void qcgc_push_object(object_t *object);
+QCGC_STATIC void mark_setup(bool incremental);
+QCGC_STATIC void mark_cleanup(bool incremental);
 
-void qcgc_mark(bool incremental) {
+void qcgc_mark(void) {
+	mark_setup(false);
+	
+	while (qcgc_state.gray_stack_size > 0) {
+		// General purpose gray stack (prebuilt objects and huge blocks)
+
+		while (qcgc_state.gp_gray_stack->index > 0) {
+			object_t *top = qcgc_gray_stack_top(qcgc_state.gp_gray_stack);
+			qcgc_state.gp_gray_stack = qcgc_gray_stack_pop(
+					qcgc_state.gp_gray_stack);
+			qcgc_pop_object(top);
+		}
+
+		// Arena gray stacks
+		for (size_t i = 0; i < qcgc_allocator_state.arenas->count; i++) {
+			arena_t *arena = qcgc_allocator_state.arenas->items[i];
+
+			while (arena->gray_stack->index > 0) {
+				object_t *top = qcgc_gray_stack_top(arena->gray_stack);
+				arena->gray_stack = qcgc_gray_stack_pop(arena->gray_stack);
+				qcgc_pop_object(top);
+			}
+		}
+	}
+
+	mark_cleanup(false);
+
+#if CHECKED
+	assert(qcgc_state.phase == GC_COLLECT);
+#endif
+}
+
+void qcgc_incmark(void) {
+	mark_setup(true);
+
+	// General purpose gray stack (prebuilt objects and huge blocks)
+	size_t to_process = MAX(qcgc_state.gp_gray_stack->index / 2,
+			QCGC_INC_MARK_MIN);
+
+	while (to_process > 0 && qcgc_state.gp_gray_stack->index > 0) {
+		object_t *top = qcgc_gray_stack_top(qcgc_state.gp_gray_stack);
+		qcgc_state.gp_gray_stack = qcgc_gray_stack_pop(
+				qcgc_state.gp_gray_stack);
+		qcgc_pop_object(top);
+		to_process--;
+	}
+
+	// Arena gray stacks
+	for (size_t i = 0; i < qcgc_allocator_state.arenas->count; i++) {
+		arena_t *arena = qcgc_allocator_state.arenas->items[i];
+		to_process = MAX(arena->gray_stack->index / 2, QCGC_INC_MARK_MIN);
+
+		while (to_process > 0 && arena->gray_stack->index > 0) {
+			object_t *top = qcgc_gray_stack_top(arena->gray_stack);
+			arena->gray_stack = qcgc_gray_stack_pop(arena->gray_stack);
+			qcgc_pop_object(top);
+			to_process--;
+		}
+	}
+
+
+	mark_cleanup(true);
+#if CHECKED
+	assert(qcgc_state.phase != GC_PAUSE);
+#endif
+}
+
+QCGC_STATIC void mark_setup(bool incremental) {
 	{
 		struct log_info_s {
 			bool incremental;
@@ -45,42 +114,9 @@
 		qcgc_push_object(*it);
 	}
 
-	while (qcgc_state.gray_stack_size > 0) {
-		// General purpose gray stack (prebuilt objects and huge blocks)
-		size_t to_process = (incremental ?
-			MIN(qcgc_state.gp_gray_stack->index,
-					MAX(qcgc_state.gp_gray_stack->index / 2, QCGC_INC_MARK_MIN)) :
-			(qcgc_state.gp_gray_stack->index));
+}
 
-		while (to_process > 0) {
-			object_t *top = qcgc_gray_stack_top(qcgc_state.gp_gray_stack);
-			qcgc_state.gp_gray_stack = qcgc_gray_stack_pop(
-					qcgc_state.gp_gray_stack);
-			qcgc_pop_object(top);
-			to_process--;
-		}
-
-		// Arena gray stacks
-		for (size_t i = 0; i < qcgc_allocator_state.arenas->count; i++) {
-			arena_t *arena = qcgc_allocator_state.arenas->items[i];
-			to_process = (incremental ?
-					MIN(arena->gray_stack->index,
-						MAX(arena->gray_stack->index / 2, QCGC_INC_MARK_MIN)) :
-					(arena->gray_stack->index));
-
-			while (to_process > 0) {
-				object_t *top = qcgc_gray_stack_top(arena->gray_stack);
-				arena->gray_stack = qcgc_gray_stack_pop(arena->gray_stack);
-				qcgc_pop_object(top);
-				to_process--;
-			}
-		}
-
-		if (incremental) {
-			break; // Execute loop once for incremental collection
-		}
-	}
-
+QCGC_STATIC void mark_cleanup(bool incremental) {
 	if (qcgc_state.gray_stack_size == 0) {
 		qcgc_state.phase = GC_COLLECT;
 	}
@@ -94,13 +130,9 @@
 		qcgc_event_logger_log(EVENT_MARK_DONE, sizeof(struct log_info_s),
 				(uint8_t *) &log_info);
 	}
-#if CHECKED
-	assert(incremental || (qcgc_state.phase = GC_COLLECT));
-	assert(qcgc_state.phase != GC_PAUSE);
-#endif
 }
 
-void qcgc_pop_object(object_t *object) {
+QCGC_STATIC QCGC_INLINE void qcgc_pop_object(object_t *object) {
 #if CHECKED
 	assert(object != NULL);
 	assert((object->flags & QCGC_PREBUILT_OBJECT) == QCGC_PREBUILT_OBJECT ||
diff --git a/rpython/translator/c/src/qcgc/src/collector.h b/rpython/translator/c/src/qcgc/src/collector.h
--- a/rpython/translator/c/src/qcgc/src/collector.h
+++ b/rpython/translator/c/src/qcgc/src/collector.h
@@ -4,5 +4,6 @@
 
 #include <stdbool.h>
 
-void qcgc_mark(bool incremental);
+void qcgc_incmark(void);
+void qcgc_mark(void);
 void qcgc_sweep(void);


More information about the pypy-commit mailing list