sync fstring pool

fstring pool should be sync with other Ractors.
This commit is contained in:
Koichi Sasada 2020-09-11 18:31:15 +09:00
parent 74ddac1c82
commit e81d7189a0
Notes: git 2020-09-15 00:05:41 +09:00
3 changed files with 32 additions and 6 deletions

View File

@ -521,4 +521,21 @@ assert_equal 'nil', %q{
r.name.inspect 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'] end # if !ENV['GITHUB_WORKFLOW']

View File

@ -13351,6 +13351,7 @@ string.$(OBJEXT): {$(VPATH)}internal/variable.h
string.$(OBJEXT): {$(VPATH)}internal/warning_push.h string.$(OBJEXT): {$(VPATH)}internal/warning_push.h
string.$(OBJEXT): {$(VPATH)}internal/xmalloc.h string.$(OBJEXT): {$(VPATH)}internal/xmalloc.h
string.$(OBJEXT): {$(VPATH)}missing.h string.$(OBJEXT): {$(VPATH)}missing.h
string.$(OBJEXT): {$(VPATH)}node.h
string.$(OBJEXT): {$(VPATH)}onigmo.h string.$(OBJEXT): {$(VPATH)}onigmo.h
string.$(OBJEXT): {$(VPATH)}oniguruma.h string.$(OBJEXT): {$(VPATH)}oniguruma.h
string.$(OBJEXT): {$(VPATH)}probes.dmyh string.$(OBJEXT): {$(VPATH)}probes.dmyh
@ -13362,6 +13363,8 @@ string.$(OBJEXT): {$(VPATH)}st.h
string.$(OBJEXT): {$(VPATH)}string.c string.$(OBJEXT): {$(VPATH)}string.c
string.$(OBJEXT): {$(VPATH)}subst.h string.$(OBJEXT): {$(VPATH)}subst.h
string.$(OBJEXT): {$(VPATH)}util.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)}config.h
strlcat.$(OBJEXT): {$(VPATH)}internal/compiler_is.h strlcat.$(OBJEXT): {$(VPATH)}internal/compiler_is.h
strlcat.$(OBJEXT): {$(VPATH)}internal/compiler_is/apple.h strlcat.$(OBJEXT): {$(VPATH)}internal/compiler_is/apple.h

View File

@ -53,6 +53,7 @@
#include "ruby/re.h" #include "ruby/re.h"
#include "ruby/util.h" #include "ruby/util.h"
#include "ruby_assert.h" #include "ruby_assert.h"
#include "vm_sync.h"
#define BEG(no) (regs->beg[(no)]) #define BEG(no) (regs->beg[(no)])
#define END(no) (regs->end[(no)]) #define END(no) (regs->end[(no)])
@ -364,13 +365,18 @@ static VALUE
register_fstring(VALUE str) register_fstring(VALUE str)
{ {
VALUE ret; VALUE ret;
st_table *frozen_strings = rb_vm_fstring_table();
do { RB_VM_LOCK_ENTER();
ret = str; {
st_update(frozen_strings, (st_data_t)str, st_table *frozen_strings = rb_vm_fstring_table();
fstr_update_callback, (st_data_t)&ret);
} while (ret == Qundef); 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(OBJ_FROZEN(ret));
assert(!FL_TEST_RAW(ret, STR_FAKESTR)); assert(!FL_TEST_RAW(ret, STR_FAKESTR));