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

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/

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