summaryrefslogtreecommitdiff
path: root/gc.c
diff options
context:
space:
mode:
authorKoichi Sasada <ko1@atdot.net>2020-10-20 11:24:37 +0900
committerKoichi Sasada <ko1@atdot.net>2020-10-20 15:39:37 +0900
commitade411465dc054af5ff025531649b69134d74b56 (patch)
tree8c7a95802fa4a1523ae54cd2858fb0fcbaa84c67 /gc.c
parent2bdbdc1580f52dc8d70a71b824238e0f20342dca (diff)
ObjectSpace.each_object with Ractors
Unshareable objects should not be touched from multiple ractors so ObjectSpace.each_object should be restricted. On multi-ractor mode, ObjectSpace.each_object only iterates shareable objects. [Feature #17270]
Notes
Notes: Merged: https://github.com/ruby/ruby/pull/3672
Diffstat (limited to 'gc.c')
-rw-r--r--gc.c6
1 files changed, 4 insertions, 2 deletions
diff --git a/gc.c b/gc.c
index 81d3bc2c27..f72d76e857 100644
--- a/gc.c
+++ b/gc.c
@@ -3292,8 +3292,10 @@ os_obj_of_i(void *vstart, void *vend, size_t stride, void *data)
volatile VALUE v = (VALUE)p;
if (!internal_object_p(v)) {
if (!oes->of || rb_obj_is_kind_of(v, oes->of)) {
- rb_yield(v);
- oes->num++;
+ if (!rb_multi_ractor_p() || rb_ractor_shareable_p(v)) {
+ rb_yield(v);
+ oes->num++;
+ }
}
}
}