diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-10-16 14:25:58 +1300 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-11-07 23:39:50 +1300 |
commit | a08ee8330d3d739467bfa34deeb797d83e59ed3c (patch) | |
tree | d14bc8f1417f39f9924b93343ddfd6451b3db8c3 /scheduler.c | |
parent | 656d4cddaf2debd0c66b9bd980f51bcbf0849bd6 (diff) |
Rename to `Fiber#set_scheduler`.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3742
Diffstat (limited to 'scheduler.c')
-rw-r--r-- | scheduler.c | 49 |
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)) { |