diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/gc.c | 12 | ||||
| -rw-r--r-- | src/vm.c | 6 |
2 files changed, 17 insertions, 1 deletions
@@ -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) |
