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

ruby-changes:64221

From: Koichi <ko1@a...>
Date: Thu, 17 Dec 2020 03:44:21 +0900 (JST)
Subject: [ruby-changes:64221] c58142134c (master): make RB_DEBUG_COUNTER_INC()_thread-safe

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

From c58142134cccdd31811f12aabf4f9dd3ce6a17f7 Mon Sep 17 00:00:00 2001
From: Koichi Sasada <ko1@a...>
Date: Thu, 17 Dec 2020 01:29:15 +0900
Subject: make RB_DEBUG_COUNTER_INC()_thread-safe


diff --git a/common.mk b/common.mk
index e5e0683..607ad86 100644
--- a/common.mk
+++ b/common.mk
@@ -3733,6 +3733,7 @@ debug_counter.$(OBJEXT): {$(VPATH)}internal/xmalloc.h https://github.com/ruby/ruby/blob/trunk/common.mk#L3733
 debug_counter.$(OBJEXT): {$(VPATH)}missing.h
 debug_counter.$(OBJEXT): {$(VPATH)}st.h
 debug_counter.$(OBJEXT): {$(VPATH)}subst.h
+debug_counter.$(OBJEXT): {$(VPATH)}thread_native.h
 dir.$(OBJEXT): $(hdrdir)/ruby.h
 dir.$(OBJEXT): $(hdrdir)/ruby/ruby.h
 dir.$(OBJEXT): $(top_srcdir)/internal/array.h
diff --git a/debug_counter.c b/debug_counter.c
index af85811..e7b0bb0 100644
--- a/debug_counter.c
+++ b/debug_counter.c
@@ -8,12 +8,14 @@ https://github.com/ruby/ruby/blob/trunk/debug_counter.c#L8
 
 **********************************************************************/
 
-#include "internal.h"
 #include "debug_counter.h"
+#include "internal.h"
 #include <stdio.h>
 #include <locale.h>
+#include "ruby/thread_native.h"
 
 #if USE_DEBUG_COUNTER
+
 static const char *const debug_counter_names[] = {
     ""
 #define RB_DEBUG_COUNTER(name) #name,
@@ -23,8 +25,28 @@ static const char *const debug_counter_names[] = { https://github.com/ruby/ruby/blob/trunk/debug_counter.c#L25
 
 MJIT_SYMBOL_EXPORT_BEGIN
 size_t rb_debug_counter[numberof(debug_counter_names)];
+void rb_debug_counter_add_atomic(enum rb_debug_counter_type type, int add);
 MJIT_SYMBOL_EXPORT_END
 
+rb_nativethread_lock_t debug_counter_lock;
+
+__attribute__((constructor))
+static void
+debug_counter_setup(void)
+{
+    rb_nativethread_lock_initialize(&debug_counter_lock);
+}
+
+void
+rb_debug_counter_add_atomic(enum rb_debug_counter_type type, int add)
+{
+    rb_nativethread_lock_lock(&debug_counter_lock);
+    {
+        rb_debug_counter[(int)type] += add;
+    }
+    rb_nativethread_lock_unlock(&debug_counter_lock);
+}
+
 int debug_counter_disable_show_at_exit = 0;
 
 // note that this operation is not atomic.
@@ -112,7 +134,9 @@ debug_counter_show_results_at_exit(void) https://github.com/ruby/ruby/blob/trunk/debug_counter.c#L134
         rb_debug_counter_show_results("normal exit.");
     }
 }
+
 #else
+
 void
 rb_debug_counter_show_results(const char *msg)
 {
diff --git a/debug_counter.h b/debug_counter.h
index 593d2f7..362c85e 100644
--- a/debug_counter.h
+++ b/debug_counter.h
@@ -391,12 +391,19 @@ enum rb_debug_counter_type { https://github.com/ruby/ruby/blob/trunk/debug_counter.h#L391
 
 #if USE_DEBUG_COUNTER
 extern size_t rb_debug_counter[];
+RUBY_EXTERN struct rb_ractor_struct *ruby_single_main_ractor;
+RUBY_EXTERN void rb_debug_counter_add_atomic(enum rb_debug_counter_type type, int add);
 
 inline static int
 rb_debug_counter_add(enum rb_debug_counter_type type, int add, int cond)
 {
     if (cond) {
-	rb_debug_counter[(int)type] += add;
+        if (ruby_single_main_ractor != NULL) {
+            rb_debug_counter[(int)type] += add;
+        }
+        else {
+            rb_debug_counter_add_atomic(type, add);
+        }
     }
     return cond;
 }
@@ -404,6 +411,7 @@ rb_debug_counter_add(enum rb_debug_counter_type type, int add, int cond) https://github.com/ruby/ruby/blob/trunk/debug_counter.h#L411
 inline static int
 rb_debug_counter_max(enum rb_debug_counter_type type, unsigned int num)
 {
+    // TODO: sync
     if (rb_debug_counter[(int)type] < num) {
         rb_debug_counter[(int)type] = num;
         return 1;
-- 
cgit v0.10.2


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

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