summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-09-11 18:31:15 +0900
committerKoichi Sasada <ko1@atdot.net>2020-09-15 00:04:59 +0900
commite81d7189a09155344b3135903300dce450232402 (patch)
tree48922bdeb367549d811e48d32e84048aef6e66d8
parent74ddac1c822697b442646f433d60e2c099db3c3b (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.rb17
-rw-r--r--common.mk3
-rw-r--r--string.c18
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));