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/