diff options
author | nari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-30 06:42:12 +0000 |
---|---|---|
committer | nari <nari@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2010-05-30 06:42:12 +0000 |
commit | a8cd15c96c02827f593d9a63fae66c2cdac5bdb6 (patch) | |
tree | 57361df5831c23d06996f229952eb10d29e441f8 /gc.c | |
parent | 480b4d0a788d1222a57a3964321e68641094df67 (diff) |
* 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]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@28087 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r-- | gc.c | 19 |
1 files changed, 4 insertions, 15 deletions
@@ -2279,7 +2279,7 @@ mark_current_machine_context(rb_objspace_t *objspace, rb_thread_t *th) 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 @@ gc_mark_all_clear(rb_objspace_t *objspace) 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 @@ gc_marks(rb_objspace_t *objspace) objspace->count++; - gc_mark_all_clear(objspace); + gc_clear_mark_on_sweep_slots(objspace); SET_STACK_END; @@ -2858,6 +2846,7 @@ rb_objspace_call_finalizer(rb_objspace_t *objspace) /* 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 */ |