summaryrefslogtreecommitdiff
path: root/string.c
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 /string.c
parent74ddac1c822697b442646f433d60e2c099db3c3b (diff)
sync fstring pool
fstring pool should be sync with other Ractors.
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3534
Diffstat (limited to 'string.c')
-rw-r--r--string.c18
1 files changed, 12 insertions, 6 deletions
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));