From 729e0a25d383e35dcf2a41ea9c46555f3b539457 Mon Sep 17 00:00:00 2001 From: nari Date: Wed, 13 May 2009 14:08:26 +0000 Subject: * gc.c: add longlife garbage collection. [ruby-dev:38423] (NORMAL_HEAPS_USED): new macro. (LONGLIFE_ALLOCATE_HEAPS_MIN): ditto. (add_longlife_heaps_slot): new function. (rb_newobj_from_longlife_heap): ditto. (rb_newobj_longlife): ditto. (rb_node_newnode_longlife): ditto. (rb_gc_write_barrier): ditto. (remembered_set_recycle): ditto. (rb_gc_mark_remembered_set): ditto. (clear_mark_longlife_heaps): ditto. (gc_sweep_for_longlife): ditto. (assign_heap_slot): new argumnent to longlife heaps slot. (add_freelist): ditto. (gc_sweep): avoid lonlife heap slot. set longlife_collection flag at add heap. (rb_gc_force_recycle): avoid mark object and remembered_set object. (garbage_collect): add longlife collection. (rb_gc_start): invoke longlife collection. (gc_profile_record_get): for longlife collction profile. (gc_profile_result): ditto. * include/ruby/intern.h (rb_gc_write_barrier): declared. * include/ruby/ruby.h (FL_REMEMBERED_SET): renamed from FL_RESERVED. * debug.c (FL_REMEMBERED_SET): ditto. * insns.def (setinlinecache): insert write barrier. * vm_insnhelper.c (vm_method_search): ditto. * set_relation (set_relation): use longlife object. * vm.c (vm_define_method): ditto. * vm_core.h (NEW_INLINE_CACHE_ENTRY): ditto. * vm_method.c (rb_add_method): ditto. * class.c (rb_add_method): ditto. * node.h (NEW_NODE_LONGLIFE): new macro. (rb_node_newnode_longlife): declared. git-svn-id: http://svn.ruby-lang.org/repos/ruby/trunk@23421 b2dd03c8-39d4-4d8f-98ff-823fe69b080e --- vm_method.c | 22 +++++++++++++++------- 1 file changed, 15 insertions(+), 7 deletions(-) (limited to 'vm_method.c') diff --git a/vm_method.c b/vm_method.c index aabe75dc0..25d2e6d0c 100644 --- a/vm_method.c +++ b/vm_method.c @@ -142,9 +142,12 @@ rb_add_method(VALUE klass, ID mid, NODE * node, int noex) * nd_cnt : alias count // (3) */ if (node) { - NODE *method = NEW_METHOD(node, klass, NOEX_WITH_SAFE(noex)); + NODE *method = NEW_NODE_LONGLIFE(NODE_METHOD, + rb_gc_write_barrier(klass), + rb_gc_write_barrier((VALUE)node), + NOEX_WITH_SAFE(noex)); method->nd_file = (void *)mid; - body = NEW_FBODY(method, mid); + body = NEW_NODE_LONGLIFE(NODE_FBODY, mid, method, 0); } else { body = 0; @@ -195,7 +198,8 @@ void rb_define_alloc_func(VALUE klass, VALUE (*func)(VALUE)) { Check_Type(klass, T_CLASS); - rb_add_method(rb_singleton_class(klass), ID_ALLOCATOR, NEW_CFUNC(func, 0), + rb_add_method(rb_singleton_class(klass), ID_ALLOCATOR, + NEW_NODE_LONGLIFE(NODE_CFUNC, func, 0, 0), NOEX_PRIVATE); } @@ -774,10 +778,14 @@ rb_alias(VALUE klass, ID name, ID def) } st_insert(RCLASS_M_TBL(klass), name, - (st_data_t) NEW_FBODY( - method = NEW_METHOD(orig_fbody->nd_body->nd_body, - orig_fbody->nd_body->nd_clss, - NOEX_WITH_SAFE(orig_fbody->nd_body->nd_noex)), def)); + (st_data_t) NEW_NODE_LONGLIFE( + NODE_FBODY, + def, + method = NEW_NODE_LONGLIFE(NODE_METHOD, + rb_gc_write_barrier((VALUE)orig_fbody->nd_body->nd_clss), + rb_gc_write_barrier((VALUE)orig_fbody->nd_body->nd_body), + NOEX_WITH_SAFE(orig_fbody->nd_body->nd_noex)), + 0)); method->nd_file = (void *)def; rb_clear_cache_by_id(name); -- cgit