Revert "ns_subclasses refcount accesses need to be atomic (#15083)" (#15138)

This reverts commit 2998c8d6b99ec49925ebea42198b29c3e27b34a7.

We need to find a better way to fix this bug. Even with this refcount
change, errors were still being seen in CI. For now we need to remove
this failing test.
This commit is contained in:
Luke Gruber 2025-11-10 21:52:43 -05:00 committed by GitHub
parent 16c6f36039
commit 148fde2754
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
Notes: git 2025-11-11 02:53:16 +00:00
Merged-By: luke-gru <luke.gru@gmail.com>
3 changed files with 7 additions and 22 deletions

View File

@ -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);

View File

@ -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);
}

View File

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