[pypy-commit] pypy quad-color-gc: Update qcgc codebase
ntruessel
pypy.commits at gmail.com
Fri Aug 19 08:24:11 EDT 2016
Author: Nicolas Truessel <ntruessel at njsm.de>
Branch: quad-color-gc
Changeset: r86312:9561ef30edb5
Date: 2016-08-19 14:23 +0200
http://bitbucket.org/pypy/pypy/changeset/9561ef30edb5/
Log: Update qcgc codebase
diff --git a/rpython/translator/c/src/qcgc/gc_state.h b/rpython/translator/c/src/qcgc/gc_state.h
--- a/rpython/translator/c/src/qcgc/gc_state.h
+++ b/rpython/translator/c/src/qcgc/gc_state.h
@@ -24,6 +24,7 @@
*/
struct qcgc_state {
shadow_stack_t *shadow_stack;
+ shadow_stack_t *prebuilt_objects;
size_t gray_stack_size;
gc_phase_t phase;
} qcgc_state;
diff --git a/rpython/translator/c/src/qcgc/object.h b/rpython/translator/c/src/qcgc/object.h
--- a/rpython/translator/c/src/qcgc/object.h
+++ b/rpython/translator/c/src/qcgc/object.h
@@ -5,6 +5,7 @@
#include <stdint.h>
#define QCGC_GRAY_FLAG 0x01
+#define QCGC_PREBUILT_OBJECT 0x02
typedef struct object_s {
uint32_t flags;
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
@@ -22,6 +22,7 @@
void qcgc_initialize(void) {
qcgc_state.shadow_stack = qcgc_shadow_stack_create(QCGC_SHADOWSTACK_SIZE);
+ qcgc_state.prebuilt_objects = qcgc_shadow_stack_create(16); //XXX
qcgc_state.gray_stack_size = 0;
qcgc_state.phase = GC_PAUSE;
qcgc_allocator_initialize();
@@ -57,7 +58,10 @@
#endif
if ((object->flags & QCGC_GRAY_FLAG) == 0) {
object->flags |= QCGC_GRAY_FLAG;
- if (qcgc_state.phase != GC_PAUSE) {
+ if ((object->flags & QCGC_PREBUILT_OBJECT) != 0) {
+ // Save prebuilt object into list
+ qcgc_shadow_stack_push(qcgc_state.prebuilt_objects, object);
+ } else if (qcgc_state.phase != GC_PAUSE) {
if (qcgc_arena_get_blocktype((cell_t *) object) == BLOCK_BLACK) {
// This was black before, push it to gray stack again
arena_t *arena = qcgc_arena_addr((cell_t *) object);
@@ -134,6 +138,11 @@
qcgc_push_object(qcgc_state.shadow_stack->items[i]);
}
+ // Trace all prebuilt objects
+ for (size_t i = 0; i < qcgc_state.prebuilt_objects->count; i++) {
+ qcgc_trace_cb(qcgc_state.prebuilt_objects->items[i], &qcgc_push_object);
+ }
+
while(qcgc_state.gray_stack_size > 0) {
for (size_t i = 0; i < qcgc_allocator_state.arenas->count; i++) {
arena_t *arena = qcgc_allocator_state.arenas->items[i];
@@ -167,6 +176,11 @@
qcgc_push_object(qcgc_state.shadow_stack->items[i]);
}
+ // Trace all prebuilt objects
+ for (size_t i = 0; i < qcgc_state.prebuilt_objects->count; i++) {
+ qcgc_trace_cb(qcgc_state.prebuilt_objects->items[i], &qcgc_push_object);
+ }
+
for (size_t i = 0; i < qcgc_allocator_state.arenas->count; i++) {
arena_t *arena = qcgc_allocator_state.arenas->items[i];
size_t initial_stack_size = arena->gray_stack->index;
@@ -210,6 +224,9 @@
assert(qcgc_state.phase == GC_MARK);
#endif
if (object != NULL) {
+ if ((object->flags & QCGC_PREBUILT_OBJECT) != 0) {
+ return;
+ }
if (qcgc_arena_get_blocktype((cell_t *) object) == BLOCK_WHITE) {
object->flags |= QCGC_GRAY_FLAG;
qcgc_arena_set_blocktype((cell_t *) object, BLOCK_BLACK);
More information about the pypy-commit
mailing list