aboutsummaryrefslogtreecommitdiffstats
path: root/scheduler.c
diff options
context:
space:
mode:
authorSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-10-16 14:25:58 +1300
committerSamuel Williams <samuel.williams@oriontransfer.co.nz>2020-11-07 23:39:50 +1300
commita08ee8330d3d739467bfa34deeb797d83e59ed3c (patch)
treed14bc8f1417f39f9924b93343ddfd6451b3db8c3 /scheduler.c
parent656d4cddaf2debd0c66b9bd980f51bcbf0849bd6 (diff)
downloadruby-a08ee8330d3d739467bfa34deeb797d83e59ed3c.tar.gz
Rename to `Fiber#set_scheduler`.
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)) {