Skip to content

Commit

Permalink
ObjectSpace._id2ref should not support unshareable
Browse files Browse the repository at this point in the history
ObjectSpace._id2ref(id) can return any objects even if they are
unshareable, so this patch raises RangeError if it runs on multi-ractor
mode and the found object is unshareable.
  • Loading branch information
ko1 committed Dec 10, 2020
1 parent 7856da5 commit 72f1c43
Show file tree
Hide file tree
Showing 2 changed files with 22 additions and 1 deletion.
13 changes: 13 additions & 0 deletions bootstraptest/test_ractor.rb
Expand Up @@ -919,6 +919,19 @@ class C
}.take
}

# ObjectSpace._id2ref can not handle unshareable objects with Ractors
assert_equal 'ok', %q{
s = 'hello'
Ractor.new s.object_id do |id ;s|
begin
s = ObjectSpace._id2ref(id)
rescue => e
:ok
end
end.take
}

# Ractor.make_shareable(obj)
assert_equal 'true', %q{
class C
Expand Down
10 changes: 9 additions & 1 deletion gc.c
Expand Up @@ -3987,6 +3987,8 @@ id2ref_obj_tbl(rb_objspace_t *objspace, VALUE objid)
* r = ObjectSpace._id2ref(s.object_id) #=> "I am a string"
* r == s #=> true
*
* On multi-ractor mode, if the object is not sharable, it raises
* RangeError.
*/

static VALUE
Expand Down Expand Up @@ -4023,7 +4025,13 @@ id2ref(VALUE objid)

if ((orig = id2ref_obj_tbl(objspace, objid)) != Qundef &&
is_live_object(objspace, orig)) {
return orig;

if (!rb_multi_ractor_p() || rb_ractor_shareable_p(orig)) {
return orig;
}
else {
rb_raise(rb_eRangeError, "%+"PRIsVALUE" is id of the unshareable object on multi-ractor", rb_int2str(objid, 10));
}
}

if (rb_int_ge(objid, objspace->next_object_id)) {
Expand Down

0 comments on commit 72f1c43

Please sign in to comment.