diff options
author | Koichi Sasada <[email protected]> | 2020-09-11 18:31:15 +0900 |
---|---|---|
committer | Koichi Sasada <[email protected]> | 2020-09-15 00:04:59 +0900 |
commit | e81d7189a09155344b3135903300dce450232402 (patch) | |
tree | 48922bdeb367549d811e48d32e84048aef6e66d8 | |
parent | 74ddac1c822697b442646f433d60e2c099db3c3b (diff) |
sync fstring pool
fstring pool should be sync with other Ractors.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3534
-rw-r--r-- | bootstraptest/test_ractor.rb | 17 | ||||
-rw-r--r-- | common.mk | 3 | ||||
-rw-r--r-- | 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'] + @@ -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 @@ -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)); |