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));
|
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 = {
|
static const rb_data_type_t BigDecimal_data_type = {
|
||||||
"BigDecimal",
|
"BigDecimal",
|
||||||
{ 0, BigDecimal_delete, BigDecimal_memsize, },
|
{ 0, BigDecimal_delete, BigDecimal_memsize, },
|
||||||
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
#ifdef RUBY_TYPED_FREE_IMMEDIATELY
|
||||||
0, 0, RUBY_TYPED_FREE_IMMEDIATELY
|
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_FROZEN_SHAREABLE
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -3351,6 +3356,9 @@ get_vp_value:
|
||||||
void
|
void
|
||||||
Init_bigdecimal(void)
|
Init_bigdecimal(void)
|
||||||
{
|
{
|
||||||
|
#ifdef HAVE_RB_EXT_RACTOR_SAFE
|
||||||
|
rb_ext_ractor_safe(true);
|
||||||
|
#endif
|
||||||
VALUE arg;
|
VALUE arg;
|
||||||
|
|
||||||
id_BigDecimal_exception_mode = rb_intern_const("BigDecimal.exception_mode");
|
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);
|
static int VpRdup(Real *m, size_t ind_m);
|
||||||
|
|
||||||
#ifdef BIGDECIMAL_DEBUG
|
#ifdef BIGDECIMAL_DEBUG
|
||||||
|
# ifdef HAVE_RB_EXT_RACTOR_SAFE
|
||||||
|
# error Need to make rewiting gnAlloc atomic
|
||||||
|
# endif
|
||||||
static int gnAlloc = 0; /* Memory allocation counter */
|
static int gnAlloc = 0; /* Memory allocation counter */
|
||||||
#endif /* BIGDECIMAL_DEBUG */
|
#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…
Add table
Reference in a new issue