allow to access ivars of frozen shareable objects
Accessing a shareable object is prohibitted because it can cause race condition, but if the shareable object is frozen, there is no problem to access ivars.
This commit is contained in:
parent
9629378477
commit
0c0d0752f1
@ -734,6 +734,18 @@ assert_equal 'can not access instance variables of shareable objects from non-ma
|
|||||||
end
|
end
|
||||||
}
|
}
|
||||||
|
|
||||||
|
# But a sharable object is frozen, it is allowed to access ivars from non-main Ractor
|
||||||
|
assert_equal '11', %q{
|
||||||
|
[Object.new, [], ].map{|obj|
|
||||||
|
obj.instance_variable_set('@a', 1)
|
||||||
|
Ractor.make_shareable obj = obj.freeze
|
||||||
|
|
||||||
|
Ractor.new obj do |obj|
|
||||||
|
obj.instance_variable_get('@a')
|
||||||
|
end.take.to_s
|
||||||
|
}.join
|
||||||
|
}
|
||||||
|
|
||||||
# cvar in sharable-objects are not allowed to access from non-main Ractor
|
# cvar in sharable-objects are not allowed to access from non-main Ractor
|
||||||
assert_equal 'can not access class variables from non-main Ractors', %q{
|
assert_equal 'can not access class variables from non-main Ractors', %q{
|
||||||
class C
|
class C
|
||||||
|
@ -922,7 +922,8 @@ generic_ivtbl(VALUE obj, ID id, bool force_check_ractor)
|
|||||||
{
|
{
|
||||||
ASSERT_vm_locking();
|
ASSERT_vm_locking();
|
||||||
|
|
||||||
if ((force_check_ractor || rb_is_instance_id(id)) && // not internal ID
|
if ((force_check_ractor || LIKELY(rb_is_instance_id(id)) /* not internal ID */ ) &&
|
||||||
|
!RB_OBJ_FROZEN_RAW(obj) &&
|
||||||
UNLIKELY(!rb_ractor_main_p()) &&
|
UNLIKELY(!rb_ractor_main_p()) &&
|
||||||
UNLIKELY(rb_ractor_shareable_p(obj))) {
|
UNLIKELY(rb_ractor_shareable_p(obj))) {
|
||||||
rb_raise(rb_eRuntimeError, "can not access instance variables of shareable objects from non-main Ractors");
|
rb_raise(rb_eRuntimeError, "can not access instance variables of shareable objects from non-main Ractors");
|
||||||
|
Loading…
x
Reference in New Issue
Block a user