From e81d7189a09155344b3135903300dce450232402 Mon Sep 17 00:00:00 2001 From: Koichi Sasada Date: Fri, 11 Sep 2020 18:31:15 +0900 Subject: [PATCH] sync fstring pool fstring pool should be sync with other Ractors. --- bootstraptest/test_ractor.rb | 17 +++++++++++++++++ common.mk | 3 +++ string.c | 18 ++++++++++++------ 3 files changed, 32 insertions(+), 6 deletions(-) diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index 141962e913..ab20082711 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -521,4 +521,21 @@ assert_equal 'nil', %q{ r.name.inspect } +### +### Synchronization tests +### + +N = 100_000 + +# fstring pool +assert_equal "#{N}#{N}", %Q{ + N = #{N} + 2.times.map{ + Ractor.new{ + N.times{|i| -(i.to_s)} + } + }.map{|r| r.take}.join +} + end # if !ENV['GITHUB_WORKFLOW'] + diff --git a/common.mk b/common.mk index fef7c3dd23..c3fb948a8e 100644 --- a/common.mk +++ b/common.mk @@ -13351,6 +13351,7 @@ string.$(OBJEXT): {$(VPATH)}internal/variable.h string.$(OBJEXT): {$(VPATH)}internal/warning_push.h string.$(OBJEXT): {$(VPATH)}internal/xmalloc.h string.$(OBJEXT): {$(VPATH)}missing.h +string.$(OBJEXT): {$(VPATH)}node.h string.$(OBJEXT): {$(VPATH)}onigmo.h string.$(OBJEXT): {$(VPATH)}oniguruma.h string.$(OBJEXT): {$(VPATH)}probes.dmyh @@ -13362,6 +13363,8 @@ string.$(OBJEXT): {$(VPATH)}st.h string.$(OBJEXT): {$(VPATH)}string.c string.$(OBJEXT): {$(VPATH)}subst.h string.$(OBJEXT): {$(VPATH)}util.h +string.$(OBJEXT): {$(VPATH)}vm_debug.h +string.$(OBJEXT): {$(VPATH)}vm_sync.h strlcat.$(OBJEXT): {$(VPATH)}config.h strlcat.$(OBJEXT): {$(VPATH)}internal/compiler_is.h strlcat.$(OBJEXT): {$(VPATH)}internal/compiler_is/apple.h diff --git a/string.c b/string.c index 0c4e76a1a7..8de906bef5 100644 --- a/string.c +++ b/string.c @@ -53,6 +53,7 @@ #include "ruby/re.h" #include "ruby/util.h" #include "ruby_assert.h" +#include "vm_sync.h" #define BEG(no) (regs->beg[(no)]) #define END(no) (regs->end[(no)]) @@ -364,13 +365,18 @@ static VALUE register_fstring(VALUE str) { VALUE ret; - st_table *frozen_strings = rb_vm_fstring_table(); - do { - ret = str; - st_update(frozen_strings, (st_data_t)str, - fstr_update_callback, (st_data_t)&ret); - } while (ret == Qundef); + RB_VM_LOCK_ENTER(); + { + st_table *frozen_strings = rb_vm_fstring_table(); + + do { + ret = str; + st_update(frozen_strings, (st_data_t)str, + fstr_update_callback, (st_data_t)&ret); + } while (ret == Qundef); + } + RB_VM_LOCK_LEAVE(); assert(OBJ_FROZEN(ret)); assert(!FL_TEST_RAW(ret, STR_FAKESTR));