diff --git a/class.c b/class.c index 550e5422f5..b4b0f556ce 100644 --- a/class.c +++ b/class.c @@ -671,7 +671,7 @@ rb_class_classext_free_subclasses(rb_classext_t *ext, VALUE klass, bool replacin } VM_ASSERT( rb_box_subclasses_ref_count(anchor->box_subclasses) > 0, - "box_subclasses refcount (%p) %d", anchor->box_subclasses, rb_box_subclasses_ref_count(anchor->box_subclasses)); + "box_subclasses refcount (%lp) %d", anchor->box_subclasses, rb_box_subclasses_ref_count(anchor->box_subclasses)); st_delete(tbl, &box_id, NULL); rb_box_subclasses_ref_dec(anchor->box_subclasses); xfree(anchor); diff --git a/internal/class.h b/internal/class.h index d4306fc84d..f122d2f189 100644 --- a/internal/class.h +++ b/internal/class.h @@ -28,29 +28,29 @@ #endif struct rb_box_subclasses { - rb_atomic_t refcount; + long refcount; struct st_table *tbl; }; typedef struct rb_box_subclasses rb_box_subclasses_t; -static inline rb_atomic_t +static inline long rb_box_subclasses_ref_count(rb_box_subclasses_t *box_sub) { - return ATOMIC_LOAD_RELAXED(box_sub->refcount); + return box_sub->refcount; } static inline rb_box_subclasses_t * rb_box_subclasses_ref_inc(rb_box_subclasses_t *box_sub) { - RUBY_ATOMIC_FETCH_ADD(box_sub->refcount, 1); + box_sub->refcount++; return box_sub; } static inline void rb_box_subclasses_ref_dec(rb_box_subclasses_t *box_sub) { - rb_atomic_t was = RUBY_ATOMIC_FETCH_SUB(box_sub->refcount, 1); - if (was == 1) { + box_sub->refcount--; + if (box_sub->refcount == 0) { st_free_table(box_sub->tbl); xfree(box_sub); } diff --git a/test/ruby/test_class.rb b/test/ruby/test_class.rb index cb05751da1..f40817e7a1 100644 --- a/test/ruby/test_class.rb +++ b/test/ruby/test_class.rb @@ -887,19 +887,4 @@ CODE class C; end end; end - - def test_subclasses_refcount_in_ractors - assert_ractor "#{<<~"begin;"}\n#{<<~'end;'}" - begin; - rs = [] - 8.times do - rs << Ractor.new do - 5_000.times do - Class.new - end - end - end - rs.each(&:join) - end; - end end