[前][次][番号順一覧][スレッド一覧]

ruby-changes:72725

From: Peter <ko1@a...>
Date: Thu, 28 Jul 2022 23:02:32 +0900 (JST)
Subject: [ruby-changes:72725] 229cf263df (master): Lock the VM for rb_gc_writebarrier_unprotect

https://git.ruby-lang.org/ruby.git/commit/?id=229cf263df

From 229cf263df8ae5020b959724b26ac7ecc5e7e122 Mon Sep 17 00:00:00 2001
From: Peter Zhu <peter@p...>
Date: Wed, 27 Jul 2022 14:05:31 -0400
Subject: Lock the VM for rb_gc_writebarrier_unprotect

When using Ractors, rb_gc_writebarrier_unprotect requries a VM lock
since it modifies the bitmaps.
---
 gc.c | 30 +++++++++++++++++-------------
 1 file changed, 17 insertions(+), 13 deletions(-)

diff --git a/gc.c b/gc.c
index cd48c47a94..df4c99b15b 100644
--- a/gc.c
+++ b/gc.c
@@ -8964,25 +8964,29 @@ rb_gc_writebarrier_unprotect(VALUE obj) https://github.com/ruby/ruby/blob/trunk/gc.c#L8964
         gc_report(2, objspace, "rb_gc_writebarrier_unprotect: %s %s\n", obj_info(obj),
                   rgengc_remembered(objspace, obj) ? " (already remembered)" : "");
 
-        if (RVALUE_OLD_P(obj)) {
-            gc_report(1, objspace, "rb_gc_writebarrier_unprotect: %s\n", obj_info(obj));
-            RVALUE_DEMOTE(objspace, obj);
-            gc_mark_set(objspace, obj);
-            gc_remember_unprotected(objspace, obj);
+        RB_VM_LOCK_ENTER_NO_BARRIER();
+        {
+            if (RVALUE_OLD_P(obj)) {
+                gc_report(1, objspace, "rb_gc_writebarrier_unprotect: %s\n", obj_info(obj));
+                RVALUE_DEMOTE(objspace, obj);
+                gc_mark_set(objspace, obj);
+                gc_remember_unprotected(objspace, obj);
 
 #if RGENGC_PROFILE
-            objspace->profile.total_shade_operation_count++;
+                objspace->profile.total_shade_operation_count++;
 #if RGENGC_PROFILE >= 2
-            objspace->profile.shade_operation_count_types[BUILTIN_TYPE(obj)]++;
+                objspace->profile.shade_operation_count_types[BUILTIN_TYPE(obj)]++;
 #endif /* RGENGC_PROFILE >= 2 */
 #endif /* RGENGC_PROFILE */
-        }
-        else {
-            RVALUE_AGE_RESET(obj);
-        }
+            }
+            else {
+                RVALUE_AGE_RESET(obj);
+            }
 
-        RB_DEBUG_COUNTER_INC(obj_wb_unprotect);
-        MARK_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), obj);
+            RB_DEBUG_COUNTER_INC(obj_wb_unprotect);
+            MARK_IN_BITMAP(GET_HEAP_WB_UNPROTECTED_BITS(obj), obj);
+        }
+        RB_VM_LOCK_LEAVE_NO_BARRIER();
     }
 }
 
-- 
cgit v1.2.1


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]