ruby-changes:68052
From: Samuel <ko1@a...>
Date: Mon, 20 Sep 2021 20:16:58 +0900 (JST)
Subject: [ruby-changes:68052] b61064b821 (master): Add gvl and fiber assertions to scheduler interface to catch invalid usage.
https://git.ruby-lang.org/ruby.git/commit/?id=b61064b821 From b61064b821823e016e8015f3d9eeab3cf9074ccd Mon Sep 17 00:00:00 2001 From: Samuel Williams <samuel.williams@o...> Date: Fri, 16 Jul 2021 15:22:17 +1200 Subject: Add gvl and fiber assertions to scheduler interface to catch invalid usage. --- common.mk | 1 + scheduler.c | 9 +++++++++ vm_eval.c | 2 ++ 3 files changed, 12 insertions(+) diff --git a/common.mk b/common.mk index 33ba2ea..c017900 100644 --- a/common.mk +++ b/common.mk @@ -12215,6 +12215,7 @@ scheduler.$(OBJEXT): $(top_srcdir)/internal/gc.h https://github.com/ruby/ruby/blob/trunk/common.mk#L12215 scheduler.$(OBJEXT): $(top_srcdir)/internal/imemo.h scheduler.$(OBJEXT): $(top_srcdir)/internal/serial.h scheduler.$(OBJEXT): $(top_srcdir)/internal/static_assert.h +scheduler.$(OBJEXT): $(top_srcdir)/internal/thread.h scheduler.$(OBJEXT): $(top_srcdir)/internal/vm.h scheduler.$(OBJEXT): $(top_srcdir)/internal/warnings.h scheduler.$(OBJEXT): {$(VPATH)}assert.h diff --git a/scheduler.c b/scheduler.c index cd06e55..127d633 100644 --- a/scheduler.c +++ b/scheduler.c @@ -11,6 +11,7 @@ https://github.com/ruby/ruby/blob/trunk/scheduler.c#L11 #include "vm_core.h" #include "ruby/fiber/scheduler.h" #include "ruby/io.h" +#include "internal/thread.h" static ID id_close; static ID id_scheduler_close; @@ -51,6 +52,8 @@ Init_Fiber_Scheduler(void) https://github.com/ruby/ruby/blob/trunk/scheduler.c#L52 VALUE rb_fiber_scheduler_get(void) { + VM_ASSERT(ruby_thread_has_gvl_p()); + rb_thread_t *thread = GET_THREAD(); VM_ASSERT(thread); @@ -80,6 +83,8 @@ verify_interface(VALUE scheduler) https://github.com/ruby/ruby/blob/trunk/scheduler.c#L83 VALUE rb_fiber_scheduler_set(VALUE scheduler) { + VM_ASSERT(ruby_thread_has_gvl_p()); + rb_thread_t *thread = GET_THREAD(); VM_ASSERT(thread); @@ -124,6 +129,8 @@ VALUE rb_fiber_scheduler_current_for_thread(VALUE thread) https://github.com/ruby/ruby/blob/trunk/scheduler.c#L129 VALUE rb_fiber_scheduler_close(VALUE scheduler) { + VM_ASSERT(ruby_thread_has_gvl_p()); + VALUE result; result = rb_check_funcall(scheduler, id_scheduler_close, 0, NULL); @@ -194,6 +201,8 @@ rb_fiber_scheduler_block(VALUE scheduler, VALUE blocker, VALUE timeout) https://github.com/ruby/ruby/blob/trunk/scheduler.c#L201 VALUE rb_fiber_scheduler_unblock(VALUE scheduler, VALUE blocker, VALUE fiber) { + VM_ASSERT(rb_obj_is_fiber(fiber)); + return rb_funcall(scheduler, id_unblock, 2, blocker, fiber); } diff --git a/vm_eval.c b/vm_eval.c index 20d63db..ed06597 100644 --- a/vm_eval.c +++ b/vm_eval.c @@ -645,6 +645,8 @@ rb_check_funcall(VALUE recv, ID mid, int argc, const VALUE *argv) https://github.com/ruby/ruby/blob/trunk/vm_eval.c#L645 static VALUE rb_check_funcall_default_kw(VALUE recv, ID mid, int argc, const VALUE *argv, VALUE def, int kw_splat) { + VM_ASSERT(ruby_thread_has_gvl_p()); + VALUE klass = CLASS_OF(recv); const rb_callable_method_entry_t *me; rb_execution_context_t *ec = GET_EC(); -- cgit v1.1 -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/