diff options
Diffstat (limited to 'vm_sync.c')
-rw-r--r-- | vm_sync.c | 26 |
1 files changed, 22 insertions, 4 deletions
@@ -7,6 +7,7 @@ void rb_ractor_sched_barrier_start(rb_vm_t *vm, rb_ractor_t *cr); void rb_ractor_sched_barrier_join(rb_vm_t *vm, rb_ractor_t *cr); +void rb_ractor_sched_barrier_end(rb_vm_t *vm, rb_ractor_t *cr); static bool vm_locked(rb_vm_t *vm) @@ -103,15 +104,26 @@ vm_lock_enter(rb_ractor_t *cr, rb_vm_t *vm, bool locked, bool no_barrier, unsign } static void -vm_lock_leave(rb_vm_t *vm, unsigned int *lev APPEND_LOCATION_ARGS) +vm_lock_leave(rb_vm_t *vm, bool no_barrier, unsigned int *lev APPEND_LOCATION_ARGS) { + rb_ractor_t *cr = vm->ractor.sync.lock_owner; + RUBY_DEBUG_LOG2(file, line, "rec:%u owner:%u%s", vm->ractor.sync.lock_rec, - (unsigned int)rb_ractor_id(vm->ractor.sync.lock_owner), + (unsigned int)rb_ractor_id(cr), vm->ractor.sync.lock_rec == 1 ? " (leave)" : ""); ASSERT_vm_locking(); VM_ASSERT(vm->ractor.sync.lock_rec > 0); VM_ASSERT(vm->ractor.sync.lock_rec == *lev); + VM_ASSERT(cr == GET_RACTOR()); + +#ifdef RUBY_THREAD_PTHREAD_H + if (vm->ractor.sched.barrier_ractor == cr && + vm->ractor.sched.barrier_lock_rec == vm->ractor.sync.lock_rec) { + VM_ASSERT(!no_barrier); + rb_ractor_sched_barrier_end(vm, cr); + } +#endif vm->ractor.sync.lock_rec--; *lev = vm->ractor.sync.lock_rec; @@ -154,9 +166,15 @@ rb_vm_lock_enter_body_cr(rb_ractor_t *cr, unsigned int *lev APPEND_LOCATION_ARGS } void +rb_vm_lock_leave_body_nb(unsigned int *lev APPEND_LOCATION_ARGS) +{ + vm_lock_leave(GET_VM(), true, lev APPEND_LOCATION_PARAMS); +} + +void rb_vm_lock_leave_body(unsigned int *lev APPEND_LOCATION_ARGS) { - vm_lock_leave(GET_VM(), lev APPEND_LOCATION_PARAMS); + vm_lock_leave(GET_VM(), false, lev APPEND_LOCATION_PARAMS); } void @@ -174,7 +192,7 @@ rb_vm_unlock_body(LOCATION_ARGS) rb_vm_t *vm = GET_VM(); ASSERT_vm_locking(); VM_ASSERT(vm->ractor.sync.lock_rec == 1); - vm_lock_leave(vm, &vm->ractor.sync.lock_rec APPEND_LOCATION_PARAMS); + vm_lock_leave(vm, false, &vm->ractor.sync.lock_rec APPEND_LOCATION_PARAMS); } static void |