From 88eb0f54e9f484ded22c8aca6a33351217d824e0 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:15:22 +0800 Subject: introduce gc_mark_gray_list(), and cleanup redaunt code with it --- src/gc.c | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index cfe48df68..bc0623be1 100644 --- a/src/gc.c +++ b/src/gc.c @@ -774,6 +774,20 @@ gc_gray_mark(mrb_state *mrb, struct RBasic *obj) return children; } + +static void +gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { + struct RBasic *obj; + + while (obj = *gray_list) { + if (is_gray(obj)) { + gc_mark_children(mrb, obj); + } + *gray_list = obj->gcnext; + } +} + + static size_t incremental_marking_phase(mrb_state *mrb, size_t limit) { @@ -790,21 +804,9 @@ static void final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); - while (mrb->gray_list) { - if (is_gray(mrb->gray_list)) - gc_mark_children(mrb, mrb->gray_list); - else - mrb->gray_list = mrb->gray_list->gcnext; - } + gc_mark_gray_list(mrb, &mrb->gray_list); + gc_mark_gray_list(mrb, &mrb->variable_gray_list); gc_assert(mrb->gray_list == NULL); - mrb->gray_list = mrb->variable_gray_list; - mrb->variable_gray_list = NULL; - while (mrb->gray_list) { - if (is_gray(mrb->gray_list)) - gc_mark_children(mrb, mrb->gray_list); - else - mrb->gray_list = mrb->gray_list->gcnext; - } gc_assert(mrb->gray_list == NULL); } -- cgit v1.2.3 From 2591922ec29681d60debe23ce99237cf6ec98b18 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:18:09 +0800 Subject: rename variable_gray_list to atomic_gray_list --- include/mruby.h | 4 ++-- src/gc.c | 12 ++++++------ 2 files changed, 8 insertions(+), 8 deletions(-) (limited to 'src') diff --git a/include/mruby.h b/include/mruby.h index 85b464b8e..ba9bbf58d 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -134,8 +134,8 @@ typedef struct mrb_state { enum gc_state gc_state; /* state of gc */ int current_white_part; /* make white object by white_part */ - struct RBasic *gray_list; /* list of gray objects */ - struct RBasic *variable_gray_list; /* list of objects to be traversed atomically */ + struct RBasic *gray_list; /* list of gray objects to be traversed incrementally */ + struct RBasic *atomic_gray_list; /* list of objects to be traversed atomically */ size_t gc_live_after_mark; size_t gc_threshold; int gc_interval_ratio; diff --git a/src/gc.c b/src/gc.c index bc0623be1..f335345df 100644 --- a/src/gc.c +++ b/src/gc.c @@ -664,7 +664,7 @@ root_scan_phase(mrb_state *mrb) if (!is_minor_gc(mrb)) { mrb->gray_list = NULL; - mrb->variable_gray_list = NULL; + mrb->atomic_gray_list = NULL; } mrb_gc_mark_gv(mrb); @@ -805,7 +805,7 @@ final_marking_phase(mrb_state *mrb) { mark_context_stack(mrb, mrb->root_c); gc_mark_gray_list(mrb, &mrb->gray_list); - gc_mark_gray_list(mrb, &mrb->variable_gray_list); + gc_mark_gray_list(mrb, &mrb->atomic_gray_list); gc_assert(mrb->gray_list == NULL); gc_assert(mrb->gray_list == NULL); } @@ -933,7 +933,7 @@ clear_all_old(mrb_state *mrb) mrb->is_generational_gc_mode = FALSE; prepare_incremental_sweep(mrb); incremental_gc_until(mrb, GC_STATE_NONE); - mrb->variable_gray_list = mrb->gray_list = NULL; + mrb->atomic_gray_list = mrb->gray_list = NULL; mrb->is_generational_gc_mode = origin_mode; } @@ -1064,8 +1064,8 @@ mrb_write_barrier(mrb_state *mrb, struct RBasic *obj) gc_assert(!is_dead(mrb, obj)); gc_assert(is_generational(mrb) || mrb->gc_state != GC_STATE_NONE); paint_gray(obj); - obj->gcnext = mrb->variable_gray_list; - mrb->variable_gray_list = obj; + obj->gcnext = mrb->atomic_gray_list; + mrb->atomic_gray_list = obj; } /* @@ -1372,7 +1372,7 @@ test_mrb_write_barrier(void) mrb_write_barrier(mrb, obj); gc_assert(is_gray(obj)); - gc_assert(mrb->variable_gray_list == obj); + gc_assert(mrb->atomic_gray_list == obj); puts(" fail with gray"); -- cgit v1.2.3 From 7bfdcace527f763055481727011bb8d172297f04 Mon Sep 17 00:00:00 2001 From: fleuria Date: Wed, 24 Jul 2013 18:27:23 +0800 Subject: fix warning --- src/gc.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src') diff --git a/src/gc.c b/src/gc.c index f335345df..22d47c6fc 100644 --- a/src/gc.c +++ b/src/gc.c @@ -779,7 +779,7 @@ static void gc_mark_gray_list(mrb_state *mrb, struct RBasic **gray_list) { struct RBasic *obj; - while (obj = *gray_list) { + while ((obj = *gray_list)) { if (is_gray(obj)) { gc_mark_children(mrb, obj); } -- cgit v1.2.3