ruby-changes:16131
From: nari <ko1@a...>
Date: Sun, 30 May 2010 15:42:27 +0900 (JST)
Subject: [ruby-changes:16131] Ruby:r28087 (trunk): * gc.c (gc_mark_all_clear): don't call obj_free() in
nari 2010-05-30 15:42:12 +0900 (Sun, 30 May 2010) New Revision: 28087 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=28087 Log: * 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] Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 28086) +++ ChangeLog (revision 28087) @@ -1,3 +1,15 @@ +Sun May 30 14:59:13 2010 Narihiro Nakamura <authorNari@g...> + + * 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] + Sun May 30 03:40:44 2010 Nobuyoshi Nakada <nobu@r...> * parse.y (parser_tokadd_utf8, parser_tokadd_string): allow NUL Index: gc.c =================================================================== --- gc.c (revision 28086) +++ gc.c (revision 28087) @@ -2279,7 +2279,7 @@ 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 @@ 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 @@ objspace->count++; - gc_mark_all_clear(objspace); + gc_clear_mark_on_sweep_slots(objspace); SET_STACK_END; @@ -2858,6 +2846,7 @@ /* 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 */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/