Author: Nicolas Truessel <ntrues...@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); _______________________________________________ pypy-commit mailing list pypy-commit@python.org https://mail.python.org/mailman/listinfo/pypy-commit