ruby-changes:16219
From: nari <ko1@a...>
Date: Sun, 6 Jun 2010 13:12:34 +0900 (JST)
Subject: [ruby-changes:16219] Ruby:r28185 (trunk): * gc.c: set_heaps_increment is not
nari 2010-06-06 13:12:20 +0900 (Sun, 06 Jun 2010) New Revision: 28185 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28185 Log: * 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] Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 28184) +++ ChangeLog (revision 28185) @@ -1,3 +1,11 @@ +Sun Jun 6 12:31:57 2010 Narihiro Nakamura <authorNari@g...> + + * 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 <nobu@r...> * array.c (rb_ary_product): need to set the length in order to get Index: gc.c =================================================================== --- gc.c (revision 28184) +++ gc.c (revision 28185) @@ -327,6 +327,7 @@ 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 @@ 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 @@ } 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 @@ 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 int gc_lazy_sweep(rb_objspace_t *objspace) { - size_t free_min; int res; INIT_GC_PROF_PARAMS; @@ -2047,13 +2053,19 @@ 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 @@ static void gc_sweep(rb_objspace_t *objspace) { - size_t free_min = 0; + before_gc_sweep(objspace); - before_gc_sweep(objspace, &free_min); - 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; -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/