6
6
#include "vm_debug.h"
7
7
8
8
void 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 );
10
10
void rb_ractor_sched_barrier_end (rb_vm_t * vm , rb_ractor_t * cr );
11
11
12
12
static bool
@@ -76,7 +76,6 @@ vm_lock_enter(rb_ractor_t *cr, rb_fiber_t *fiber, rb_vm_t *vm, bool locked, bool
76
76
#endif
77
77
// lock
78
78
rb_native_mutex_lock (& vm -> ractor .sync .lock );
79
- VM_ASSERT (vm -> ractor .sync .lock_owner == NULL );
80
79
VM_ASSERT (vm -> ractor .sync .lock_owner_fiber == NULL );
81
80
VM_ASSERT (vm -> ractor .sync .lock_rec == 0 );
82
81
@@ -88,28 +87,26 @@ vm_lock_enter(rb_ractor_t *cr, rb_fiber_t *fiber, rb_vm_t *vm, bool locked, bool
88
87
do {
89
88
VM_ASSERT (vm_need_barrier_waiting (vm ));
90
89
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 );
92
91
} while (vm_need_barrier_waiting (vm ));
93
92
}
94
93
95
94
VM_ASSERT (vm -> ractor .sync .lock_rec == 0 );
96
- VM_ASSERT (vm -> ractor .sync .lock_owner == NULL );
97
95
VM_ASSERT (vm -> ractor .sync .lock_owner_fiber == NULL );
98
- vm -> ractor .sync .lock_owner = cr ;
99
96
vm -> ractor .sync .lock_owner_fiber = fiber ;
100
97
}
101
98
102
99
vm -> ractor .sync .lock_rec ++ ;
103
100
* lev = vm -> ractor .sync .lock_rec ;
104
101
105
102
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 ));
107
104
}
108
105
109
106
static void
110
107
vm_lock_leave (rb_vm_t * vm , bool no_barrier , unsigned int * lev APPEND_LOCATION_ARGS )
111
108
{
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 );
113
110
114
111
RUBY_DEBUG_LOG2 (file , line , "rec:%u owner:%u%s" , vm -> ractor .sync .lock_rec ,
115
112
(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
132
129
* lev = vm -> ractor .sync .lock_rec ;
133
130
134
131
if (vm -> ractor .sync .lock_rec == 0 ) {
135
- vm -> ractor .sync .lock_owner = NULL ;
136
132
vm -> ractor .sync .lock_owner_fiber = NULL ;
137
133
rb_native_mutex_unlock (& vm -> ractor .sync .lock );
138
134
}
@@ -204,11 +200,9 @@ vm_cond_wait(rb_vm_t *vm, rb_nativethread_cond_t *cond, unsigned long msec)
204
200
{
205
201
ASSERT_vm_locking ();
206
202
unsigned int lock_rec = vm -> ractor .sync .lock_rec ;
207
- rb_ractor_t * cr = vm -> ractor .sync .lock_owner ;
208
203
rb_fiber_t * fiber = vm -> ractor .sync .lock_owner_fiber ;
209
204
210
205
vm -> ractor .sync .lock_rec = 0 ;
211
- vm -> ractor .sync .lock_owner = NULL ;
212
206
vm -> ractor .sync .lock_owner_fiber = NULL ;
213
207
if (msec > 0 ) {
214
208
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)
217
211
rb_native_cond_wait (cond , & vm -> ractor .sync .lock );
218
212
}
219
213
vm -> ractor .sync .lock_rec = lock_rec ;
220
- vm -> ractor .sync .lock_owner = cr ;
221
214
vm -> ractor .sync .lock_owner_fiber = fiber ;
222
215
}
223
216
@@ -249,12 +242,11 @@ rb_vm_barrier(void)
249
242
RB_DEBUG_COUNTER_INC (vm_sync_barrier );
250
243
251
244
if (!rb_multi_ractor_p ()) {
252
- // no other ractors
253
245
return ;
254
246
}
255
247
else {
256
248
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 ;
258
250
259
251
ASSERT_vm_locking ();
260
252
VM_ASSERT (cr == GET_RACTOR ());
0 commit comments