ruby-changes:63105
From: Koichi <ko1@a...>
Date: Fri, 25 Sep 2020 16:00:31 +0900 (JST)
Subject: [ruby-changes:63105] 96739c4222 (master): Frozen Struct can be shareable.
https://git.ruby-lang.org/ruby.git/commit/?id=96739c4222 From 96739c422206d55acab4aee917d9d965c27b6fff Mon Sep 17 00:00:00 2001 From: Koichi Sasada <ko1@a...> Date: Fri, 25 Sep 2020 14:06:32 +0900 Subject: Frozen Struct can be shareable. A frozen Struct object which refers to shareable objects should be shareable. diff --git a/bootstraptest/test_ractor.rb b/bootstraptest/test_ractor.rb index f06513a..5ed8f63 100644 --- a/bootstraptest/test_ractor.rb +++ b/bootstraptest/test_ractor.rb @@ -427,6 +427,7 @@ assert_equal "ok", %q{ https://github.com/ruby/ruby/blob/trunk/bootstraptest/test_ractor.rb#L427 class C; end module M; end + S = Struct.new(:a, :b, :c, :d) shareable_objects = [ true, @@ -445,6 +446,8 @@ assert_equal "ok", %q{ https://github.com/ruby/ruby/blob/trunk/bootstraptest/test_ractor.rb#L446 [1, 2].freeze, # frozen Array which only refers to shareable {a: 1}.freeze, # frozen Hash which only refers to shareable [{a: 1}.freeze, 'str'.freeze].freeze, # nested frozen container + S.new(1, 2).freeze, # frozen Struct + S.new(1, 2, 3, 4).freeze, # frozen Struct C, # class M, # module Ractor.current, # Ractor @@ -454,6 +457,9 @@ assert_equal "ok", %q{ https://github.com/ruby/ruby/blob/trunk/bootstraptest/test_ractor.rb#L457 'mutable str'.dup, [:array], {hash: true}, + S.new(1, 2), + S.new(1, 2, 3, 4), + S.new("a", 2).freeze, # frozen, but refers to an unshareable object ] results = [] diff --git a/ractor.c b/ractor.c index 382d3d5..6ef294d 100644 --- a/ractor.c +++ b/ractor.c @@ -7,6 +7,7 @@ https://github.com/ruby/ruby/blob/trunk/ractor.c#L7 #include "vm_sync.h" #include "ractor.h" #include "internal/error.h" +#include "internal/struct.h" static VALUE rb_cRactor; static VALUE rb_eRactorError; @@ -1785,6 +1786,22 @@ rb_ractor_shareable_p_hash_i(VALUE key, VALUE value, VALUE arg) https://github.com/ruby/ruby/blob/trunk/ractor.c#L1786 } static bool +ractor_struct_shareable_members_p(VALUE obj) +{ + VM_ASSERT(RB_TYPE_P(obj, T_STRUCT)); + + long len = RSTRUCT_LEN(obj); + const VALUE *ptr = RSTRUCT_CONST_PTR(obj); + + for (long i=0; i<len; i++) { + if (!rb_ractor_shareable_p(ptr[i])) { + return false; + } + } + return true; +} + +static bool ractor_obj_ivars_shareable_p(VALUE obj) { uint32_t len = ROBJECT_NUMIV(obj); @@ -1850,6 +1867,19 @@ rb_ractor_shareable_p_continue(VALUE obj) https://github.com/ruby/ruby/blob/trunk/ractor.c#L1867 return false; } } + case T_STRUCT: + if (!RB_OBJ_FROZEN_RAW(obj) || + FL_TEST_RAW(obj, RUBY_FL_EXIVAR)) { + return false; + } + else { + if (ractor_struct_shareable_members_p(obj)) { + goto shareable; + } + else { + return false; + } + } case T_OBJECT: if (RB_OBJ_FROZEN_RAW(obj) && ractor_obj_ivars_shareable_p(obj)) { goto shareable; -- cgit v0.10.2 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/