mirror of
https://github.com/ruby/ruby.git
synced 2022-11-09 12:17:21 -05:00
[bigdecimal] Make bigdecimal Ractor safe
https://github.com/ruby/bigdecimal/commit/93fc392640 https://github.com/ruby/bigdecimal/commit/a90d13c4d0
This commit is contained in:
parent
97d4e72e0b
commit
928a06723d
2 changed files with 35 additions and 1 deletions
|
@ -189,11 +189,16 @@ BigDecimal_memsize(const void *ptr)
|
|||
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:
|
|||
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);
|
|||
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 */
|
||||
|
||||
|
|
23
test/bigdecimal/test_ractor.rb
Normal file
23
test/bigdecimal/test_ractor.rb
Normal file
|
@ -0,0 +1,23 @@
|
|||
# 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
|
Loading…
Reference in a new issue