1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00
Kenta Murata 2020-12-19 02:45:47 +09:00
parent 97d4e72e0b
commit 928a06723d
No known key found for this signature in database
GPG key ID: CEFE8AFB6081B062
2 changed files with 35 additions and 1 deletions

View file

@ -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 */

View 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