[前][次][番号順一覧][スレッド一覧]

ruby-changes:64337

From: Kenta <ko1@a...>
Date: Sat, 19 Dec 2020 22:14:41 +0900 (JST)
Subject: [ruby-changes:64337] 928a06723d (master): [bigdecimal] Make bigdecimal Ractor safe

https://git.ruby-lang.org/ruby.git/commit/?id=928a06723d

From 928a06723d1ede495b7c3b42f3ca48e370ccec77 Mon Sep 17 00:00:00 2001
From: Kenta Murata <mrkn@m...>
Date: Sat, 19 Dec 2020 02:45:47 +0900
Subject: [bigdecimal] Make bigdecimal Ractor safe

https://github.com/ruby/bigdecimal/commit/93fc392640
https://github.com/ruby/bigdecimal/commit/a90d13c4d0

diff --git a/ext/bigdecimal/bigdecimal.c b/ext/bigdecimal/bigdecimal.c
index 9952193..039a4d7 100644
--- a/ext/bigdecimal/bigdecimal.c
+++ b/ext/bigdecimal/bigdecimal.c
@@ -189,11 +189,16 @@ BigDecimal_memsize(const void *ptr) https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L189
     return (sizeof(*pv) + pv->MaxPrec * sizeof(BDIGIT));
 }
 
+#ifndef HAVE_RB_EXT_RACTOR_SAFE
+#   undef RUBY_TYPED_FROZEN_SHAREABLE
+#   define RUBY_TYPED_FROZEN_SHAREABLE 0
+#endif
+
 static const rb_data_type_t BigDecimal_data_type = {
     "BigDecimal",
     { 0, BigDecimal_delete, BigDecimal_memsize, },
 #ifdef RUBY_TYPED_FREE_IMMEDIATELY
-    0, 0, RUBY_TYPED_FREE_IMMEDIATELY
+    0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE
 #endif
 };
 
@@ -3351,6 +3356,9 @@ get_vp_value: https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L3356
 void
 Init_bigdecimal(void)
 {
+#ifdef HAVE_RB_EXT_RACTOR_SAFE
+    rb_ext_ractor_safe(true);
+#endif
     VALUE arg;
 
     id_BigDecimal_exception_mode = rb_intern_const("BigDecimal.exception_mode");
@@ -3617,6 +3625,9 @@ static void VpFormatSt(char *psz, size_t fFmt); https://github.com/ruby/ruby/blob/trunk/ext/bigdecimal/bigdecimal.c#L3625
 static int VpRdup(Real *m, size_t ind_m);
 
 #ifdef BIGDECIMAL_DEBUG
+# ifdef HAVE_RB_EXT_RACTOR_SAFE
+#  error Need to make rewiting gnAlloc atomic
+# endif
 static int gnAlloc = 0; /* Memory allocation counter */
 #endif /* BIGDECIMAL_DEBUG */
 
diff --git a/test/bigdecimal/test_ractor.rb b/test/bigdecimal/test_ractor.rb
new file mode 100644
index 0000000..3ccd7c8
--- /dev/null
+++ b/test/bigdecimal/test_ractor.rb
@@ -0,0 +1,23 @@ https://github.com/ruby/ruby/blob/trunk/test/bigdecimal/test_ractor.rb#L1
+# frozen_string_literal: true
+require_relative "testbase"
+
+class TestBigDecimalRactor < Test::Unit::TestCase
+  include TestBigDecimalBase
+
+  def setup
+    super
+    skip unless defined? Ractor
+  end
+
+  def test_ractor_shareable
+    assert_separately([], "#{<<~"begin;"}\n#{<<~'end;'}")
+    begin;
+      $VERBOSE = nil
+      require "bigdecimal"
+      r = Ractor.new BigDecimal(Math::PI, Float::DIG+1) do |pi|
+        BigDecimal('2.0')*pi
+      end
+      assert_equal(2*Math::PI, r.take)
+    end;
+  end
+end
-- 
cgit v0.10.2


--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]