From 28754d0aa9a61d401fad2791deda139338ba2df0 Mon Sep 17 00:00:00 2001 From: nari Date: Sun, 6 Jun 2010 04:12:20 +0000 Subject: * gc.c: set_heaps_increment is not called before gc_makrs of lazy sweeping because live_num not contain finalize objects. So call set_heaps_increment after lazy sweeping if free_num are not enough. And move free_min to struct rb_objspace for above. [ruby-dev:41499] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28185 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 8 ++++++++ gc.c | 37 +++++++++++++++++++++---------------- 2 files changed, 29 insertions(+), 16 deletions(-) diff --git a/ChangeLog b/ChangeLog index 99cd03b623..2986136c77 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,11 @@ +Sun Jun 6 12:31:57 2010 Narihiro Nakamura + + * gc.c: set_heaps_increment is not + called before gc_makrs of lazy sweeping because live_num not + contain finalize objects. So call set_heaps_increment after lazy + sweeping if free_num are not enough. And move free_min to struct + rb_objspace for above. [ruby-dev:41499] + Sun Jun 6 10:44:34 2010 Nobuyoshi Nakada * array.c (rb_ary_product): need to set the length in order to get diff --git a/gc.c b/gc.c index ad13e683b2..d8c703bfee 100644 --- a/gc.c +++ b/gc.c @@ -327,6 +327,7 @@ typedef struct rb_objspace { RVALUE *freed; size_t live_num; size_t free_num; + size_t free_min; size_t do_heap_free; } heap; struct { @@ -968,6 +969,7 @@ assign_heap_slot(rb_objspace_t *objspace) heaps->membase = membase; heaps->slot = p; heaps->limit = objs; + objspace->heap.free_num += objs; pend = p + objs; if (lomem == 0 || lomem > p) lomem = p; if (himem < pend) himem = pend; @@ -1966,14 +1968,14 @@ ready_to_gc(rb_objspace_t *objspace) } static void -before_gc_sweep(rb_objspace_t *objspace, size_t *free_min) +before_gc_sweep(rb_objspace_t *objspace) { freelist = 0; objspace->heap.do_heap_free = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.65); - *free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.2); - if (*free_min < FREE_MIN) { + objspace->heap.free_min = (size_t)((heaps_used * HEAP_OBJ_LIMIT) * 0.2); + if (objspace->heap.free_min < FREE_MIN) { objspace->heap.do_heap_free = heaps_used * HEAP_OBJ_LIMIT; - *free_min = FREE_MIN; + objspace->heap.free_min = FREE_MIN; } objspace->heap.sweep_slots = heaps; objspace->heap.free_num = 0; @@ -1985,6 +1987,11 @@ after_gc_sweep(rb_objspace_t *objspace) rb_thread_t *th = GET_THREAD(); GC_PROF_SET_MALLOC_INFO; + if (objspace->heap.free_num < objspace->heap.free_min) { + set_heaps_increment(objspace); + heaps_increment(objspace); + } + if (malloc_increase > malloc_limit) { malloc_limit += (size_t)((malloc_increase - malloc_limit) * (double)objspace->heap.live_num / (heaps_used * HEAP_OBJ_LIMIT)); if (malloc_limit < GC_MALLOC_LIMIT) malloc_limit = GC_MALLOC_LIMIT; @@ -2025,7 +2032,6 @@ static void gc_marks(rb_objspace_t *objspace); static int gc_lazy_sweep(rb_objspace_t *objspace) { - size_t free_min; int res; INIT_GC_PROF_PARAMS; @@ -2047,13 +2053,19 @@ gc_lazy_sweep(rb_objspace_t *objspace) gc_marks(objspace); - before_gc_sweep(objspace, &free_min); - if (free_min > (heaps_used * HEAP_OBJ_LIMIT - objspace->heap.live_num)) { + before_gc_sweep(objspace); + if (objspace->heap.free_min > (heaps_used * HEAP_OBJ_LIMIT - objspace->heap.live_num)) { set_heaps_increment(objspace); } GC_PROF_SWEEP_TIMER_START; - res = lazy_sweep(objspace); + if(!(res = lazy_sweep(objspace))) { + after_gc_sweep(objspace); + if(freelist) { + res = TRUE; + during_gc = 0; + } + } GC_PROF_SWEEP_TIMER_STOP; GC_PROF_TIMER_STOP(Qtrue); @@ -2063,20 +2075,13 @@ gc_lazy_sweep(rb_objspace_t *objspace) static void gc_sweep(rb_objspace_t *objspace) { - size_t free_min = 0; - - before_gc_sweep(objspace, &free_min); + before_gc_sweep(objspace); while (objspace->heap.sweep_slots) { slot_sweep(objspace, objspace->heap.sweep_slots); objspace->heap.sweep_slots = objspace->heap.sweep_slots->next; } - if (objspace->heap.free_num < free_min) { - set_heaps_increment(objspace); - heaps_increment(objspace); - } - after_gc_sweep(objspace); during_gc = 0; -- cgit v1.2.3