From 9d3ba342c90aeec8cec3011967b31bd1d03ae86b Mon Sep 17 00:00:00 2001 From: shyouhei Date: Fri, 3 Dec 2010 03:53:21 +0000 Subject: [PATCH] * 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@30065 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- ChangeLog | 12 ++++++++++++ gc.c | 6 ++++++ vm.c | 6 +++--- 3 files changed, 21 insertions(+), 3 deletions(-) diff --git a/ChangeLog b/ChangeLog index 7b732baf62..87b15e5856 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,15 @@ +Fri Dec 3 12:41:52 2010 URABE Shyouhei + + * 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 * vm_insnhelper.c (vm_call_method): protected singleton methods should diff --git a/gc.c b/gc.c index cf9107ab8e..d7dfa017e5 100644 --- a/gc.c +++ b/gc.c @@ -400,9 +400,15 @@ rb_objspace_alloc(void) 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; diff --git a/vm.c b/vm.c index aca61c6906..015456bd93 100644 --- a/vm.c +++ b/vm.c @@ -1545,14 +1545,14 @@ ruby_vm_destruct(rb_vm_t *vm) 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;