@@ -268,6 +268,8 @@ struct rb_fiber_struct {
268268
269269 unsigned int killed : 1 ;
270270
271+ rb_serial_t serial ;
272+
271273 struct coroutine_context context ;
272274 struct fiber_pool_stack stack ;
273275};
@@ -1010,6 +1012,13 @@ rb_fiber_threadptr(const rb_fiber_t *fiber)
10101012 return fiber -> cont .saved_ec .thread_ptr ;
10111013}
10121014
1015+ rb_serial_t
1016+ rb_fiber_serial (const rb_fiber_t * fiber )
1017+ {
1018+ VM_ASSERT (fiber -> serial >= 1 );
1019+ return fiber -> serial ;
1020+ }
1021+
10131022static VALUE
10141023cont_thread_value (const rb_context_t * cont )
10151024{
@@ -1995,6 +2004,13 @@ fiber_alloc(VALUE klass)
19952004 return TypedData_Wrap_Struct (klass , & fiber_data_type , 0 );
19962005}
19972006
2007+ static rb_serial_t
2008+ next_fiber_serial (void )
2009+ {
2010+ static rbimpl_atomic_uint64_t fiber_serial = 1 ;
2011+ return (rb_serial_t )ATOMIC_U64_FETCH_ADD (fiber_serial , 1 );
2012+ }
2013+
19982014static rb_fiber_t *
19992015fiber_t_alloc (VALUE fiber_value , unsigned int blocking )
20002016{
@@ -2011,6 +2027,7 @@ fiber_t_alloc(VALUE fiber_value, unsigned int blocking)
20112027 fiber -> cont .type = FIBER_CONTEXT ;
20122028 fiber -> blocking = blocking ;
20132029 fiber -> killed = 0 ;
2030+ fiber -> serial = next_fiber_serial ();
20142031 cont_init (& fiber -> cont , th );
20152032
20162033 fiber -> cont .saved_ec .fiber_ptr = fiber ;
@@ -2563,6 +2580,7 @@ rb_threadptr_root_fiber_setup(rb_thread_t *th)
25632580 fiber -> cont .saved_ec .thread_ptr = th ;
25642581 fiber -> blocking = 1 ;
25652582 fiber -> killed = 0 ;
2583+ fiber -> serial = next_fiber_serial ();
25662584 fiber_status_set (fiber , FIBER_RESUMED ); /* skip CREATED */
25672585 th -> ec = & fiber -> cont .saved_ec ;
25682586 cont_init_jit_cont (& fiber -> cont );
0 commit comments