summaryrefslogtreecommitdiff
path: root/scheduler.c
diff options
context:
space:
mode:
Diffstat (limited to 'scheduler.c')
-rw-r--r--scheduler.c49
1 files changed, 49 insertions, 0 deletions
diff --git a/scheduler.c b/scheduler.c
index d7e713a710..326cb0068f 100644
--- a/scheduler.c
+++ b/scheduler.c
@@ -8,6 +8,7 @@
**********************************************************************/
+#include "vm_core.h"
#include "internal/scheduler.h"
#include "ruby/io.h"
@@ -38,6 +39,54 @@ Init_Scheduler(void)
}
VALUE
+rb_scheduler_get()
+{
+ rb_thread_t *thread = GET_THREAD();
+ VM_ASSERT(thread);
+
+ return thread->scheduler;
+}
+
+VALUE
+rb_scheduler_set(VALUE scheduler)
+{
+ rb_thread_t *thread = GET_THREAD();
+ VM_ASSERT(thread);
+
+ // We invoke Scheduler#close when setting it to something else, to ensure the previous scheduler runs to completion before changing the scheduler. That way, we do not need to consider interactions, e.g., of a Fiber from the previous scheduler with the new scheduler.
+ if (thread->scheduler != Qnil) {
+ rb_scheduler_close(thread->scheduler);
+ }
+
+ thread->scheduler = scheduler;
+
+ return thread->scheduler;
+}
+
+static VALUE
+rb_threadptr_scheduler_current(rb_thread_t *thread)
+{
+ VM_ASSERT(thread);
+
+ if (thread->blocking == 0) {
+ return thread->scheduler;
+ } else {
+ return Qnil;
+ }
+}
+
+VALUE
+rb_scheduler_current()
+{
+ return rb_threadptr_scheduler_current(GET_THREAD());
+}
+
+VALUE rb_thread_scheduler_current(VALUE thread)
+{
+ return rb_threadptr_scheduler_current(rb_thread_ptr(thread));
+}
+
+VALUE
rb_scheduler_close(VALUE scheduler)
{
if (rb_respond_to(scheduler, id_close)) {