Store fiber serial as Ractor-local

This commit is contained in:
John Hawthorn 2025-11-24 21:07:08 -08:00
parent 0eb53053f0
commit 4263f1d718
Notes: git 2025-11-25 21:49:06 +00:00
4 changed files with 8 additions and 28 deletions

9
cont.c
View File

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

View File

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

View File

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

View File

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