From c58142134cccdd31811f12aabf4f9dd3ce6a17f7 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Thu, 17 Dec 2020 01:29:15 +0900 Subject: [PATCH] make RB_DEBUG_COUNTER_INC()_thread-safe --- common.mk | 1 + debug_counter.c | 26 +++++++++++++++++++++++++- debug_counter.h | 10 +++++++++- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/common.mk b/common.mk index e5e0683012..607ad861aa 100644 --- a/common.mk +++ b/common.mk @@ -3733,6 +3733,7 @@ debug_counter.$(OBJEXT): {$(VPATH)}internal/xmalloc.h 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 af858115d2..e7b0bb0acd 100644 --- a/debug_counter.c +++ b/debug_counter.c @@ -8,12 +8,14 @@ **********************************************************************/ -#include "internal.h" #include "debug_counter.h" +#include "internal.h" #include #include +#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[] = { 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) 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 593d2f701d..362c85e2f5 100644 --- a/debug_counter.h +++ b/debug_counter.h @@ -391,12 +391,19 @@ enum rb_debug_counter_type { #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) 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;