ruby-changes:35385
From: ko1 <ko1@a...>
Date: Tue, 9 Sep 2014 14:12:25 +0900 (JST)
Subject: [ruby-changes:35385] ko1:r47467 (trunk): * gc.c: move rb_objspace_t::flags::gc_stressfull after during_gc
ko1 2014-09-09 14:12:15 +0900 (Tue, 09 Sep 2014) New Revision: 47467 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=revision&revision=47467 Log: * gc.c: move rb_objspace_t::flags::gc_stressfull after during_gc to make accesssing both parameters easy. * gc.c (heap_get_freeobj): add LIKELY() hint. * gc.c (heap_get_freeobj_from_next_freepage): ditto. * gc.c (newobj_of): check both parameters at once for exceptional case. Modified files: trunk/ChangeLog trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 47466) +++ ChangeLog (revision 47467) @@ -1,3 +1,15 @@ https://github.com/ruby/ruby/blob/trunk/ChangeLog#L1 +Tue Sep 9 14:09:36 2014 Koichi Sasada <ko1@a...> + + * gc.c: move rb_objspace_t::flags::gc_stressfull after during_gc + to make accesssing both parameters easy. + + * gc.c (heap_get_freeobj): add LIKELY() hint. + + * gc.c (heap_get_freeobj_from_next_freepage): ditto. + + * gc.c (newobj_of): check both parameters at once for exceptional + case. + Tue Sep 9 13:51:32 2014 Koichi Sasada <ko1@a...> * gc.c: add rb_objspace_t::flags::gc_stressfull and Index: gc.c =================================================================== --- gc.c (revision 47466) +++ gc.c (revision 47467) @@ -464,11 +464,11 @@ typedef struct rb_objspace { https://github.com/ruby/ruby/blob/trunk/gc.c#L464 struct { enum gc_stat stat : 2; - unsigned int gc_stressfull: 1; unsigned int immediate_sweep : 1; unsigned int dont_gc : 1; unsigned int dont_incremental : 1; unsigned int during_gc : 1; + unsigned int gc_stressfull: 1; #if USE_RGENGC unsigned int during_minor_gc : 1; #endif @@ -1538,7 +1538,7 @@ heap_get_freeobj_from_next_freepage(rb_o https://github.com/ruby/ruby/blob/trunk/gc.c#L1538 struct heap_page *page; RVALUE *p; - while (heap->free_pages == NULL) { + while (UNLIKELY(heap->free_pages == NULL)) { heap_prepare(objspace, heap); } page = heap->free_pages; @@ -1558,7 +1558,7 @@ heap_get_freeobj(rb_objspace_t *objspace https://github.com/ruby/ruby/blob/trunk/gc.c#L1558 RVALUE *p = heap->freelist; while (1) { - if (p) { + if (LIKELY(p != NULL)) { heap->freelist = p->as.free.next; return (VALUE)p; } @@ -1594,15 +1594,17 @@ newobj_of(VALUE klass, VALUE flags, VALU https://github.com/ruby/ruby/blob/trunk/gc.c#L1594 rb_objspace_t *objspace = &rb_objspace; VALUE obj; - if (UNLIKELY(during_gc)) { - dont_gc = 1; - during_gc = 0; - rb_bug("object allocation during garbage collection phase"); - } + if (UNLIKELY(during_gc || ruby_gc_stressfull)) { + if (during_gc) { + dont_gc = 1; + during_gc = 0; + rb_bug("object allocation during garbage collection phase"); + } - if (UNLIKELY(ruby_gc_stressfull)) { - if (!garbage_collect(objspace, FALSE, FALSE, FALSE, GPR_FLAG_NEWOBJ)) { - rb_memerror(); + if (ruby_gc_stressfull) { + if (!garbage_collect(objspace, FALSE, FALSE, FALSE, GPR_FLAG_NEWOBJ)) { + rb_memerror(); + } } } -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/