summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog12
-rw-r--r--gc.c6
-rw-r--r--vm.c6
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 <shyouhei@ruby-lang.org>
+
+ * 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@ruby-lang.org>
* 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;