aboutsummaryrefslogtreecommitdiffstats
path: root/scheduler.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-07-16 15:22:17 +1200
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2021-09-20 23:16:45 +1200
commitb61064b821823e016e8015f3d9eeab3cf9074ccd (patch)
treec6f4718621a159ae5b0575dd252c4d7d409ac20c /scheduler.c
parentcb8434563d3cc8fc5c3a5aa1e34ad7a9bb542cdb (diff)
downloadruby-b61064b821823e016e8015f3d9eeab3cf9074ccd.tar.gz
Add gvl and fiber assertions to scheduler interface to catch invalid usage.
Diffstat (limited to 'scheduler.c')
-rw-r--r--scheduler.c9
1 files changed, 9 insertions, 0 deletions
diff --git a/scheduler.c b/scheduler.c
index cd06e55635..127d63383b 100644
--- a/scheduler.c
+++ b/scheduler.c
@@ -11,6 +11,7 @@
#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)
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)
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)
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)
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);
}