mirror of
https://github.com/ruby/ruby.git
synced 2026-01-26 12:14:51 +00:00
Store fiber serial as Ractor-local
This commit is contained in:
parent
0eb53053f0
commit
4263f1d718
Notes:
git
2025-11-25 21:49:06 +00:00
9
cont.c
9
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);
|
||||
|
||||
2
ractor.c
2
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;
|
||||
|
||||
@ -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;
|
||||
|
||||
@ -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
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user