[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]