summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-12-17 04:06:04 +0900
committerKoichi Sasada <ko1@atdot.net>2020-12-17 17:37:52 +0900
commit99b91453809be68c604f94416030addfff3d6142 (patch)
treeec391592a6ddaffc4a282eee442a408083b3a817 /gc.c
parent44fba194a5561a5ca20f6bd91fb96b7d8edd1dbb (diff)
relax synchronization on WB
Current synchronization is too much on write barriers.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3918
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c39
1 files changed, 10 insertions, 29 deletions
diff --git a/gc.c b/gc.c
index a06f3ce025..c067ac4745 100644
--- a/gc.c
+++ b/gc.c
@@ -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;
}