summaryrefslogtreecommitdiff
path: root/vm_sync.c
diff options
context:
space:
mode:
Diffstat (limited to 'vm_sync.c')
-rw-r--r--vm_sync.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/vm_sync.c b/vm_sync.c
index ba311a00e9..aca83dde5a 100644
--- a/vm_sync.c
+++ b/vm_sync.c
@@ -26,6 +26,20 @@ RUBY_ASSERT_vm_locking(void)
}
void
+RUBY_ASSERT_vm_locking_with_barrier(void)
+{
+ if (rb_multi_ractor_p()) {
+ rb_vm_t *vm = GET_VM();
+ VM_ASSERT(vm_locked(vm));
+
+ if (vm->ractor.cnt > 1) {
+ /* Written to only when holding both ractor.sync and ractor.sched lock */
+ VM_ASSERT(vm->ractor.sched.barrier_waiting);
+ }
+ }
+}
+
+void
RUBY_ASSERT_vm_unlocking(void)
{
if (rb_multi_ractor_p()) {
@@ -283,3 +297,14 @@ rb_ec_vm_lock_rec_release(const rb_execution_context_t *ec,
VM_ASSERT(recorded_lock_rec == rb_ec_vm_lock_rec(ec));
}
+
+VALUE
+rb_vm_lock_with_barrier(VALUE (*func)(void *args), void *args)
+{
+ VALUE result = 0;
+ RB_VM_LOCKING() {
+ rb_vm_barrier();
+ result = func(args);
+ }
+ return result;
+}