66#include "vm_debug.h"
77
88void rb_ractor_sched_barrier_start (rb_vm_t * vm , rb_ractor_t * cr );
9- void rb_ractor_sched_barrier_join (rb_vm_t * vm , rb_ractor_t * cr );
9+ void rb_ractor_sched_barrier_join (rb_vm_t * vm , rb_ractor_t * cr , rb_fiber_t * fiber );
1010void rb_ractor_sched_barrier_end (rb_vm_t * vm , rb_ractor_t * cr );
1111
1212static bool
@@ -76,7 +76,6 @@ vm_lock_enter(rb_ractor_t *cr, rb_fiber_t *fiber, rb_vm_t *vm, bool locked, bool
7676#endif
7777 // lock
7878 rb_native_mutex_lock (& vm -> ractor .sync .lock );
79- VM_ASSERT (vm -> ractor .sync .lock_owner == NULL );
8079 VM_ASSERT (vm -> ractor .sync .lock_owner_fiber == NULL );
8180 VM_ASSERT (vm -> ractor .sync .lock_rec == 0 );
8281
@@ -88,28 +87,26 @@ vm_lock_enter(rb_ractor_t *cr, rb_fiber_t *fiber, rb_vm_t *vm, bool locked, bool
8887 do {
8988 VM_ASSERT (vm_need_barrier_waiting (vm ));
9089 RUBY_DEBUG_LOG ("barrier serial:%u" , vm -> ractor .sched .barrier_serial );
91- rb_ractor_sched_barrier_join (vm , cr );
90+ rb_ractor_sched_barrier_join (vm , cr , fiber );
9291 } while (vm_need_barrier_waiting (vm ));
9392 }
9493
9594 VM_ASSERT (vm -> ractor .sync .lock_rec == 0 );
96- VM_ASSERT (vm -> ractor .sync .lock_owner == NULL );
9795 VM_ASSERT (vm -> ractor .sync .lock_owner_fiber == NULL );
98- vm -> ractor .sync .lock_owner = cr ;
9996 vm -> ractor .sync .lock_owner_fiber = fiber ;
10097 }
10198
10299 vm -> ractor .sync .lock_rec ++ ;
103100 * lev = vm -> ractor .sync .lock_rec ;
104101
105102 RUBY_DEBUG_LOG2 (file , line , "rec:%u owner:%u" , vm -> ractor .sync .lock_rec ,
106- (unsigned int )rb_ractor_id (vm -> ractor . sync . lock_owner ));
103+ (unsigned int )rb_ractor_id (cr ));
107104}
108105
109106static void
110107vm_lock_leave (rb_vm_t * vm , bool no_barrier , unsigned int * lev APPEND_LOCATION_ARGS )
111108{
112- MAYBE_UNUSED (rb_ractor_t * cr = vm -> ractor .sync .lock_owner );
109+ MAYBE_UNUSED (rb_ractor_t * cr = rb_fiber_threadptr ( vm -> ractor .sync .lock_owner_fiber ) -> ractor );
113110
114111 RUBY_DEBUG_LOG2 (file , line , "rec:%u owner:%u%s" , vm -> ractor .sync .lock_rec ,
115112 (unsigned int )rb_ractor_id (cr ),
@@ -132,7 +129,6 @@ vm_lock_leave(rb_vm_t *vm, bool no_barrier, unsigned int *lev APPEND_LOCATION_AR
132129 * lev = vm -> ractor .sync .lock_rec ;
133130
134131 if (vm -> ractor .sync .lock_rec == 0 ) {
135- vm -> ractor .sync .lock_owner = NULL ;
136132 vm -> ractor .sync .lock_owner_fiber = NULL ;
137133 rb_native_mutex_unlock (& vm -> ractor .sync .lock );
138134 }
@@ -204,11 +200,9 @@ vm_cond_wait(rb_vm_t *vm, rb_nativethread_cond_t *cond, unsigned long msec)
204200{
205201 ASSERT_vm_locking ();
206202 unsigned int lock_rec = vm -> ractor .sync .lock_rec ;
207- rb_ractor_t * cr = vm -> ractor .sync .lock_owner ;
208203 rb_fiber_t * fiber = vm -> ractor .sync .lock_owner_fiber ;
209204
210205 vm -> ractor .sync .lock_rec = 0 ;
211- vm -> ractor .sync .lock_owner = NULL ;
212206 vm -> ractor .sync .lock_owner_fiber = NULL ;
213207 if (msec > 0 ) {
214208 rb_native_cond_timedwait (cond , & vm -> ractor .sync .lock , msec );
@@ -217,7 +211,6 @@ vm_cond_wait(rb_vm_t *vm, rb_nativethread_cond_t *cond, unsigned long msec)
217211 rb_native_cond_wait (cond , & vm -> ractor .sync .lock );
218212 }
219213 vm -> ractor .sync .lock_rec = lock_rec ;
220- vm -> ractor .sync .lock_owner = cr ;
221214 vm -> ractor .sync .lock_owner_fiber = fiber ;
222215}
223216
@@ -249,12 +242,11 @@ rb_vm_barrier(void)
249242 RB_DEBUG_COUNTER_INC (vm_sync_barrier );
250243
251244 if (!rb_multi_ractor_p ()) {
252- // no other ractors
253245 return ;
254246 }
255247 else {
256248 rb_vm_t * vm = GET_VM ();
257- rb_ractor_t * cr = vm -> ractor .sync .lock_owner ;
249+ rb_ractor_t * cr = rb_fiber_threadptr ( vm -> ractor .sync .lock_owner_fiber ) -> ractor ;
258250
259251 ASSERT_vm_locking ();
260252 VM_ASSERT (cr == GET_RACTOR ());
0 commit comments