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/