Skip to content

Commit

Permalink
make RB_DEBUG_COUNTER_INC()_thread-safe
Browse files Browse the repository at this point in the history
  • Loading branch information
ko1 committed Dec 16, 2020
1 parent d5929b3 commit c581421
Show file tree
Hide file tree
Showing 3 changed files with 35 additions and 2 deletions.
1 change: 1 addition & 0 deletions common.mk
Expand Up @@ -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
Expand Down
26 changes: 25 additions & 1 deletion debug_counter.c
Expand Up @@ -8,12 +8,14 @@
**********************************************************************/

#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,
Expand All @@ -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.
Expand Down Expand Up @@ -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)
{
Expand Down
10 changes: 9 additions & 1 deletion debug_counter.h
Expand Up @@ -391,19 +391,27 @@ 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;
}

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;
Expand Down

0 comments on commit c581421

Please sign in to comment.