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

ruby-changes:16131

From: nari <ko1@a...>
Date: Sun, 30 May 2010 15:42:27 +0900 (JST)
Subject: [ruby-changes:16131] Ruby:r28087 (trunk): * gc.c (gc_mark_all_clear): don't call obj_free() in

nari	2010-05-30 15:42:12 +0900 (Sun, 30 May 2010)

  New Revision: 28087

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28087

  Log:
    * gc.c (gc_mark_all_clear): don't call obj_free() in
      gc_mark_all_clear(), because obj_free() may make T_ZOMBIE
      objects.
    
    * gc.c (gc_clear_mark_on_sweep_slots): renamed.
    
    * gc.c (rb_objspace_call_finalizer): call
      gc_clear_mark_on_sweep_slots() before calling mark_tbl().
      [ruby-dev:41459]

  Modified files:
    trunk/ChangeLog
    trunk/gc.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 28086)
+++ ChangeLog	(revision 28087)
@@ -1,3 +1,15 @@
+Sun May 30 14:59:13 2010  Narihiro Nakamura  <authorNari@g...>
+
+	* gc.c (gc_mark_all_clear): don't call obj_free() in
+	  gc_mark_all_clear(), because obj_free() may make T_ZOMBIE
+	  objects.
+
+	* gc.c (gc_clear_mark_on_sweep_slots): renamed.
+
+	* gc.c (rb_objspace_call_finalizer): call
+  	  gc_clear_mark_on_sweep_slots() before calling mark_tbl().
+	  [ruby-dev:41459]
+
 Sun May 30 03:40:44 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* parse.y (parser_tokadd_utf8, parser_tokadd_string): allow NUL
Index: gc.c
===================================================================
--- gc.c	(revision 28086)
+++ gc.c	(revision 28087)
@@ -2279,7 +2279,7 @@
 void rb_gc_mark_encodings(void);
 
 static void
-gc_mark_all_clear(rb_objspace_t *objspace)
+gc_clear_mark_on_sweep_slots(rb_objspace_t *objspace)
 {
     struct heaps_slot *scan;
     RVALUE *p, *pend;
@@ -2289,25 +2289,13 @@
             scan = objspace->heap.sweep_slots;
             p = scan->slot; pend = p + scan->limit;
             while (p < pend) {
-                if (!(RBASIC(p)->flags & FL_MARK)) {
-                    if (p->as.basic.flags && !FL_TEST(p, FL_FINALIZE)) {
-                        obj_free(objspace, (VALUE)p);
-                        VALGRIND_MAKE_MEM_UNDEFINED((void*)p, sizeof(RVALUE));
-                        p->as.free.flags = 0;
-                    }
-                }
-                else if (RBASIC(p)->flags != FL_MARK) {
+                if (p->as.free.flags & FL_MARK && BUILTIN_TYPE(p) != T_ZOMBIE) {
                     p->as.basic.flags &= ~FL_MARK;
                 }
                 p++;
             }
             objspace->heap.sweep_slots = objspace->heap.sweep_slots->next;
         }
-        p = deferred_final_list;
-        while(p) {
-            p->as.free.flags |= FL_MARK;
-            p = p->as.free.next;
-        }
     }
 }
 
@@ -2322,7 +2310,7 @@
     objspace->count++;
 
 
-    gc_mark_all_clear(objspace);
+    gc_clear_mark_on_sweep_slots(objspace);
 
     SET_STACK_END;
 
@@ -2858,6 +2846,7 @@
 
     /* run finalizers */
     if (finalizer_table) {
+        gc_clear_mark_on_sweep_slots(objspace);
 	do {
 	    /* XXX: this loop will make no sense */
 	    /* because mark will not be removed */

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

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