summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-09 05:12:15 +0000
committerko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-09-09 05:12:15 +0000
commit3238a4a729e39315168e126ae4c562cc203dad89 (patch)
tree3ed287ed847d2aff2421e8d2921f57f6438ecd2d /gc.c
parentddac04d2c279c9bf86d00157240f316a7f0bb34d (diff)
* 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. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@47467 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c24
1 files changed, 13 insertions, 11 deletions
diff --git a/gc.c b/gc.c
index 54ff2045cd..ec1bc7ba93 100644
--- a/gc.c
+++ b/gc.c
@@ -464,11 +464,11 @@ typedef struct rb_objspace {
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_objspace_t *objspace, rb_heap_t *heap)
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, rb_heap_t *heap)
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, VALUE v1, VALUE v2, VALUE v3)
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();
+ }
}
}