diff --git a/gc.c b/gc.c index 7dee915fab..9d314c7416 100644 --- a/gc.c +++ b/gc.c @@ -288,6 +288,7 @@ rb_gc_run_obj_finalizer(VALUE objid, long count, VALUE (*callback)(long i, void saved.finished = 0; saved.final = Qundef; + rb_ractor_ignore_belonging(true); EC_PUSH_TAG(ec); enum ruby_tag_type state = EC_EXEC_TAG(); if (state != TAG_NONE) { @@ -306,6 +307,7 @@ rb_gc_run_obj_finalizer(VALUE objid, long count, VALUE (*callback)(long i, void rb_check_funcall(saved.final, idCall, 1, &objid); } EC_POP_TAG(); + rb_ractor_ignore_belonging(false); #undef RESTORE_FINALIZER } diff --git a/ractor.c b/ractor.c index 2f4dfecd1a..56345d5670 100644 --- a/ractor.c +++ b/ractor.c @@ -33,6 +33,11 @@ static VALUE rb_cRactorMovedObject; static void vm_ractor_blocking_cnt_inc(rb_vm_t *vm, rb_ractor_t *r, const char *file, int line); + +#if RACTOR_CHECK_MODE > 0 +bool rb_ractor_ignore_belonging_flag = false; +#endif + // Ractor locking static void diff --git a/ractor_core.h b/ractor_core.h index 5eee15ad15..1e37463466 100644 --- a/ractor_core.h +++ b/ractor_core.h @@ -266,9 +266,13 @@ rb_ractor_belonging(VALUE obj) } } +extern bool rb_ractor_ignore_belonging_flag; + static inline VALUE rb_ractor_confirm_belonging(VALUE obj) { + if (rb_ractor_ignore_belonging_flag) return obj; + uint32_t id = rb_ractor_belonging(obj); if (id == 0) { @@ -288,6 +292,14 @@ rb_ractor_confirm_belonging(VALUE obj) } return obj; } + +static inline void +rb_ractor_ignore_belonging(bool flag) +{ + rb_ractor_ignore_belonging_flag = flag; +} + #else #define rb_ractor_confirm_belonging(obj) obj +#define rb_ractor_ignore_belonging(flag) (0) #endif