[前][次][番号順一覧][スレッド一覧]

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/

[前][次][番号順一覧][スレッド一覧]