ruby-changes:16483
From: nari <ko1@a...>
Date: Tue, 29 Jun 2010 12:11:27 +0900 (JST)
Subject: [ruby-changes:16483] Ruby:r28472 (trunk): * gc.c (unlink_heap_slot, slot_sweep): unlink heaps_slot of
nari 2010-06-29 12:11:05 +0900 (Tue, 29 Jun 2010) New Revision: 28472 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28472 Log: * gc.c (unlink_heap_slot, slot_sweep): unlink heaps_slot of heaps_slot linked list if heaps_slot is empty at slot_sweep. fixed [ruby-dev:41543], [ruby-core:24894]. Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 28471) +++ ChangeLog (revision 28472) @@ -1,3 +1,9 @@ +Tue Jun 29 11:52:33 2010 Narihiro Nakamura <authorNari@g...> + + * gc.c (unlink_heap_slot, slot_sweep): unlink heaps_slot of + heaps_slot linked list if heaps_slot is empty at slot_sweep. + fixed [ruby-dev:41543], [ruby-core:24894]. + Tue Jun 29 01:22:08 2010 Aaron Patterson <aaron@t...> * ext/fiddle/fiddle.h: added FFI type detection to avoid bug in ffi Index: gc.c =================================================================== --- gc.c (revision 28471) +++ gc.c (revision 28472) @@ -1857,6 +1857,22 @@ } static void +unlink_heap_slot(rb_objspace_t *objspace, struct heaps_slot *slot) +{ + if (slot->prev) + slot->prev->next = slot->next; + if (slot->next) + slot->next->prev = slot->prev; + if (heaps == slot) + heaps = slot->next; + if (objspace->heap.sweep_slots == slot) + objspace->heap.sweep_slots = slot->next; + slot->prev = NULL; + slot->next = NULL; +} + + +static void free_unused_heaps(rb_objspace_t *objspace) { size_t i, j; @@ -1870,14 +1886,6 @@ else { free(objspace->heap.sorted[i].slot->membase); } - if (objspace->heap.sorted[i].slot->prev) - objspace->heap.sorted[i].slot->prev->next = objspace->heap.sorted[i].slot->next; - if (objspace->heap.sorted[i].slot->next) - objspace->heap.sorted[i].slot->next->prev = objspace->heap.sorted[i].slot->prev; - if (heaps == objspace->heap.sorted[i].slot) - heaps = objspace->heap.sorted[i].slot->next; - if (objspace->heap.sweep_slots == objspace->heap.sorted[i].slot) - objspace->heap.sweep_slots = objspace->heap.sorted[i].slot->next; free(objspace->heap.sorted[i].slot); heaps_used--; } @@ -1946,6 +1954,7 @@ } sweep_slot->limit = final_num; freelist = free; /* cancel this page from freelist */ + unlink_heap_slot(objspace, sweep_slot); } else { objspace->heap.free_num += free_num; @@ -2015,10 +2024,13 @@ static int lazy_sweep(rb_objspace_t *objspace) { + struct heaps_slot *next; + heaps_increment(objspace); while (objspace->heap.sweep_slots) { - slot_sweep(objspace, objspace->heap.sweep_slots); - objspace->heap.sweep_slots = objspace->heap.sweep_slots->next; + next = objspace->heap.sweep_slots->next; + slot_sweep(objspace, objspace->heap.sweep_slots); + objspace->heap.sweep_slots = next; if (freelist) { during_gc = 0; return TRUE; @@ -2076,11 +2088,14 @@ static void gc_sweep(rb_objspace_t *objspace) { + struct heaps_slot *next; + before_gc_sweep(objspace); while (objspace->heap.sweep_slots) { + next = objspace->heap.sweep_slots->next; slot_sweep(objspace, objspace->heap.sweep_slots); - objspace->heap.sweep_slots = objspace->heap.sweep_slots->next; + objspace->heap.sweep_slots = next; } after_gc_sweep(objspace); -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/