diff options
author | Koichi Sasada <ko1@atdot.net> | 2020-12-17 04:06:04 +0900 |
---|---|---|
committer | Koichi Sasada <ko1@atdot.net> | 2020-12-17 17:37:52 +0900 |
commit | 99b91453809be68c604f94416030addfff3d6142 (patch) | |
tree | ec391592a6ddaffc4a282eee442a408083b3a817 | |
parent | 44fba194a5561a5ca20f6bd91fb96b7d8edd1dbb (diff) | |
download | ruby-99b91453809be68c604f94416030addfff3d6142.tar.gz |
relax synchronization on WB
Current synchronization is too much on write barriers.
-rw-r--r-- | gc.c | 39 |
1 files changed, 10 insertions, 29 deletions
@@ -7689,7 +7689,11 @@ gc_writebarrier_generational(VALUE a, VALUE b, rb_objspace_t *objspace) #if 1 /* mark `a' and remember (default behavior) */ if (!rgengc_remembered(objspace, a)) { - rgengc_remember(objspace, a); + RB_VM_LOCK_ENTER_NO_BARRIER(); + { + rgengc_remember(objspace, a); + } + RB_VM_LOCK_LEAVE_NO_BARRIER(); gc_report(1, objspace, "gc_writebarrier_generational: %s (remembered) -> %s\n", obj_info(a), obj_info(b)); } #else @@ -7763,49 +7767,26 @@ void rb_gc_writebarrier(VALUE a, VALUE b) { rb_objspace_t *objspace = &rb_objspace; - bool retry; if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(a)) rb_bug("rb_gc_writebarrier: a is special const"); if (RGENGC_CHECK_MODE && SPECIAL_CONST_P(b)) rb_bug("rb_gc_writebarrier: b is special const"); - retry_: - retry = false; if (!is_incremental_marking(objspace)) { if (!RVALUE_OLD_P(a) || RVALUE_OLD_P(b)) { // do nothing } else { - RB_VM_LOCK_ENTER_NO_BARRIER(); // can change GC state - { - if (!is_incremental_marking(objspace)) { - if (!RVALUE_OLD_P(a) || RVALUE_OLD_P(b)) { - // do nothing - } - else { - gc_writebarrier_generational(a, b, objspace); - } - } - else { - retry = true; - } - } - RB_VM_LOCK_LEAVE_NO_BARRIER(); + gc_writebarrier_generational(a, b, objspace); } } - else { /* slow path */ - RB_VM_LOCK_ENTER_NO_BARRIER(); // can change GC state + else { + /* slow path */ + RB_VM_LOCK_ENTER_NO_BARRIER(); { - if (is_incremental_marking(objspace)) { - gc_writebarrier_incremental(a, b, objspace); - } - else { - retry = true; - } + gc_writebarrier_incremental(a, b, objspace); } RB_VM_LOCK_LEAVE_NO_BARRIER(); } - if (retry) goto retry_; - return; } |