diff --git a/cont.c b/cont.c index d167685f13..c49256c977 100644 --- a/cont.c +++ b/cont.c @@ -2005,10 +2005,9 @@ fiber_alloc(VALUE klass) } static rb_serial_t -next_fiber_serial(void) +next_fiber_serial(rb_ractor_t *cr) { - static rbimpl_atomic_uint64_t fiber_serial = 1; - return (rb_serial_t)ATOMIC_U64_FETCH_ADD(fiber_serial, 1); + return cr->next_fiber_serial++; } static rb_fiber_t* @@ -2027,7 +2026,7 @@ fiber_t_alloc(VALUE fiber_value, unsigned int blocking) fiber->cont.type = FIBER_CONTEXT; fiber->blocking = blocking; fiber->killed = 0; - fiber->serial = next_fiber_serial(); + fiber->serial = next_fiber_serial(th->ractor); cont_init(&fiber->cont, th); fiber->cont.saved_ec.fiber_ptr = fiber; @@ -2580,7 +2579,7 @@ rb_threadptr_root_fiber_setup(rb_thread_t *th) fiber->cont.saved_ec.thread_ptr = th; fiber->blocking = 1; fiber->killed = 0; - fiber->serial = next_fiber_serial(); + fiber->serial = next_fiber_serial(th->ractor); fiber_status_set(fiber, FIBER_RESUMED); /* skip CREATED */ th->ec = &fiber->cont.saved_ec; cont_init_jit_cont(&fiber->cont); diff --git a/ractor.c b/ractor.c index 48fbf7cfb9..3fc507128c 100644 --- a/ractor.c +++ b/ractor.c @@ -418,6 +418,7 @@ ractor_alloc(VALUE klass) VALUE rv = TypedData_Make_Struct(klass, rb_ractor_t, &ractor_data_type, r); FL_SET_RAW(rv, RUBY_FL_SHAREABLE); r->pub.self = rv; + r->next_fiber_serial = 1; VM_ASSERT(ractor_status_p(r, ractor_created)); return rv; } @@ -435,6 +436,7 @@ rb_ractor_main_alloc(void) r->name = Qnil; r->pub.self = Qnil; r->newobj_cache = rb_gc_ractor_cache_alloc(r); + r->next_fiber_serial = 1; ruby_single_main_ractor = r; return r; diff --git a/ractor_core.h b/ractor_core.h index 130ccb1118..81374c0769 100644 --- a/ractor_core.h +++ b/ractor_core.h @@ -88,6 +88,8 @@ struct rb_ractor_struct { // ractor local data + rb_serial_t next_fiber_serial; + st_table *local_storage; struct rb_id_table *idkey_local_storage; VALUE local_storage_store_lock; diff --git a/ruby_atomic.h b/ruby_atomic.h index b60c56cfd8..cbcfe682ce 100644 --- a/ruby_atomic.h +++ b/ruby_atomic.h @@ -70,27 +70,4 @@ rbimpl_atomic_u64_set_relaxed(volatile rbimpl_atomic_uint64_t *address, uint64_t } #define ATOMIC_U64_SET_RELAXED(var, val) rbimpl_atomic_u64_set_relaxed(&(var), val) -static inline uint64_t -rbimpl_atomic_u64_fetch_add(volatile rbimpl_atomic_uint64_t *ptr, uint64_t val) -{ -#if defined(HAVE_GCC_ATOMIC_BUILTINS_64) - return __atomic_fetch_add(ptr, val, __ATOMIC_SEQ_CST); -#elif defined(_WIN32) - return InterlockedExchangeAdd64((volatile LONG64 *)ptr, val); -#elif defined(__sun) && defined(HAVE_ATOMIC_H) && (defined(_LP64) || defined(_I32LPx)) - return atomic_add_64_nv(ptr, val) - val; -#elif defined(HAVE_STDATOMIC_H) - return atomic_fetch_add_explicit((_Atomic uint64_t *)ptr, val, memory_order_seq_cst); -#else - // Fallback using mutex for platforms without 64-bit atomics - static rb_nativethread_mutex_t lock = RB_NATIVETHREAD_LOCK_INIT; - rb_native_mutex_lock(&lock); - uint64_t old = *ptr; - *ptr = old + val; - rb_native_mutex_unlock(&lock); - return old; -#endif -} -#define ATOMIC_U64_FETCH_ADD(var, val) rbimpl_atomic_u64_fetch_add(&(var), val) - #endif