diff options
| -rw-r--r-- | include/mruby.h | 10 | ||||
| -rw-r--r-- | src/gc.c | 12 | ||||
| -rw-r--r-- | src/vm.c | 6 | ||||
| -rw-r--r-- | test/t/gc.rb | 45 |
4 files changed, 62 insertions, 11 deletions
diff --git a/include/mruby.h b/include/mruby.h index f9df6100b..845443a1b 100644 --- a/include/mruby.h +++ b/include/mruby.h @@ -241,16 +241,6 @@ void mrb_write_barrier(mrb_state *, struct RBasic*); #define MRUBY_VERSION "Rite" -#ifdef DEBUG -#undef DEBUG -#endif - -#if 0 -#define DEBUG(x) x -#else -#define DEBUG(x) -#endif - mrb_value mrb_check_convert_type(mrb_state *mrb, mrb_value val, mrb_int type, const char *tname, const char *method); mrb_value mrb_any_to_s(mrb_state *mrb, mrb_value obj); const char * mrb_obj_classname(mrb_state *mrb, mrb_value obj); @@ -147,8 +147,10 @@ gettimeofday_time(void) #ifdef GC_DEBUG #include <assert.h> #define gc_assert(expect) assert(expect) +#define DEBUG(x) (x) #else #define gc_assert(expect) ((void)0) +#define DEBUG(x) #endif #define GC_STEP_SIZE 1024 @@ -206,6 +208,7 @@ struct heap_page { struct heap_page *next; struct heap_page *free_next; struct heap_page *free_prev; + unsigned int old:1; RVALUE objects[MRB_HEAP_PAGE_SIZE]; }; @@ -762,6 +765,11 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) int dead_slot = 1; int full = (page->freelist == NULL); + if (is_minor_gc(mrb) && page->old) { + /* skip a slot which doesn't contain any young object */ + p = e; + dead_slot = 0; + } while (p<e) { if (is_dead(mrb, &p->as.basic)) { if (p->as.basic.tt != MRB_TT_FREE) { @@ -792,6 +800,10 @@ incremental_sweep_phase(mrb_state *mrb, size_t limit) if (full && freed > 0) { link_free_heap_page(mrb, page); } + if (page->freelist == NULL && is_minor_gc(mrb)) + page->old = TRUE; + else + page->old = FALSE; page = page->next; } tried_sweep += MRB_HEAP_PAGE_SIZE; @@ -49,7 +49,11 @@ The value below allows about 60000 recursive calls in the simplest case. */ #define MRB_STACK_MAX ((1<<18) - MRB_STACK_GROWTH) #endif - +#ifdef VM_DEBUG +# define DEBUG(x) (x) +#else +# define DEBUG(x) +#endif static inline void stack_copy(mrb_value *dst, const mrb_value *src, size_t size) diff --git a/test/t/gc.rb b/test/t/gc.rb new file mode 100644 index 000000000..410272797 --- /dev/null +++ b/test/t/gc.rb @@ -0,0 +1,45 @@ +# Not ISO specified + +assert('GC.enable') do + GC.disable == false + GC.enable == true + GC.enable == false +end + +assert('GC.disable') do + begin + GC.disable == false + GC.disable == true + ensure + GC.enable + end +end + +assert('GC.interval_ratio=') do + origin = GC.interval_ratio + begin + (GC.interval_ratio = 150) == 150 + ensure + GC.interval_ratio = origin + end +end + +assert('GC.step_ratio=') do + origin = GC.step_ratio + begin + (GC.step_ratio = 150) == 150 + ensure + GC.step_ratio = origin + end +end + +assert('GC.generational_mode=') do + origin = GC.generational_mode + begin + (GC.generational_mode = false) == false + (GC.generational_mode = true) == true + (GC.generational_mode = true) == true + ensure + GC.generational_mode = origin + end +end |
