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

ruby-changes:18044

From: shyouhei <ko1@a...>
Date: Fri, 3 Dec 2010 12:53:27 +0900 (JST)
Subject: [ruby-changes:18044] Ruby:r30065 (trunk): * gc.c (rb_objspace_free): With our "lazy-sweep" GC engine, it is

shyouhei	2010-12-03 12:53:21 +0900 (Fri, 03 Dec 2010)

  New Revision: 30065

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

  Log:
    * gc.c (rb_objspace_free): With our "lazy-sweep" GC engine, it is
      possible for an object to survive until its surrounding object
      space is about to be freed.  Those objects, if any, remains not
      leaked for the rest of a process life.  This is problematic
      because for instance a T_DATA object may have its own destructor
      to terminate something.
    
    * vm.c (ruby_vm_destruct): ruby_current_vm termination should be
      somewhere after rb_objspace_free for above reason.

  Modified files:
    trunk/ChangeLog
    trunk/gc.c
    trunk/vm.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 30064)
+++ ChangeLog	(revision 30065)
@@ -1,3 +1,15 @@
+Fri Dec  3 12:41:52 2010  URABE Shyouhei  <shyouhei@r...>
+
+	* gc.c (rb_objspace_free): With our "lazy-sweep" GC engine, it is
+	  possible for an object to survive until its surrounding object
+	  space is about to be freed.  Those objects, if any, remains not
+	  leaked for the rest of a process life.  This is problematic
+	  because for instance a T_DATA object may have its own destructor
+	  to terminate something.
+
+	* vm.c (ruby_vm_destruct): ruby_current_vm termination should be
+	  somewhere after rb_objspace_free for above reason.
+
 Fri Dec  3 12:17:19 2010  Nobuyoshi Nakada  <nobu@r...>
 
 	* vm_insnhelper.c (vm_call_method): protected singleton methods should
Index: gc.c
===================================================================
--- gc.c	(revision 30064)
+++ gc.c	(revision 30065)
@@ -400,9 +400,15 @@
     return objspace;
 }
 
+static void gc_sweep(rb_objspace_t *);
+static void slot_sweep(rb_objspace_t *, struct heaps_slot *);
+static void gc_clear_mark_on_sweep_slots(rb_objspace_t *);
+
 void
 rb_objspace_free(rb_objspace_t *objspace)
 {
+    gc_clear_mark_on_sweep_slots(objspace);
+    gc_sweep(objspace);
     if (objspace->profile.record) {
 	free(objspace->profile.record);
 	objspace->profile.record = 0;
Index: vm.c
===================================================================
--- vm.c	(revision 30064)
+++ vm.c	(revision 30065)
@@ -1545,14 +1545,14 @@
 	    st_free_table(vm->living_threads);
 	    vm->living_threads = 0;
 	}
-	rb_vm_gvl_destroy(vm);
-	ruby_xfree(vm);
-	ruby_current_vm = 0;
 #if defined(ENABLE_VM_OBJSPACE) && ENABLE_VM_OBJSPACE
 	if (objspace) {
 	    rb_objspace_free(objspace);
 	}
 #endif
+	rb_vm_gvl_destroy(vm);
+	ruby_xfree(vm);
+	ruby_current_vm = 0;
     }
     RUBY_FREE_LEAVE("vm");
     return 0;

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

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