diff options
author | Samuel Williams <[email protected]> | 2020-10-16 14:25:58 +1300 |
---|---|---|
committer | Samuel Williams <[email protected]> | 2020-11-07 23:39:50 +1300 |
commit | a08ee8330d3d739467bfa34deeb797d83e59ed3c (patch) | |
tree | d14bc8f1417f39f9924b93343ddfd6451b3db8c3 /cont.c | |
parent | 656d4cddaf2debd0c66b9bd980f51bcbf0849bd6 (diff) |
Rename to `Fiber#set_scheduler`.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3742
Diffstat (limited to 'cont.c')
-rw-r--r-- | cont.c | 44 |
1 files changed, 41 insertions, 3 deletions
@@ -25,6 +25,7 @@ #include "internal/mjit.h" #include "internal/proc.h" #include "internal/warnings.h" +#include "internal/scheduler.h" #include "mjit.h" #include "vm_core.h" #include "id_table.h" @@ -1821,7 +1822,7 @@ static VALUE rb_fiber_initialize_kw(int argc, VALUE* argv, VALUE self, int kw_splat) { VALUE pool = Qnil; - VALUE blocking = Qtrue; + VALUE blocking = Qfalse; if (kw_splat != RB_NO_KEYWORDS) { VALUE options = Qnil; @@ -1830,8 +1831,13 @@ rb_fiber_initialize_kw(int argc, VALUE* argv, VALUE self, int kw_splat) argc = rb_scan_args_kw(kw_splat, argc, argv, ":", &options); rb_get_kwargs(options, fiber_initialize_keywords, 0, 2, arguments); - blocking = arguments[0]; - pool = arguments[1]; + if (arguments[0] != Qundef) { + blocking = arguments[0]; + } + + if (arguments[1] != Qundef) { + pool = arguments[1]; + } } return fiber_initialize(self, rb_block_proc(), rb_fiber_pool_default(pool), RTEST(blocking)); @@ -1872,6 +1878,22 @@ rb_f_fiber(int argc, VALUE *argv, VALUE obj) return rb_f_fiber_kw(argc, argv, rb_keyword_given_p()); } +static VALUE +rb_fiber_scheduler(VALUE klass) +{ + return rb_scheduler_get(); +} + +static VALUE +rb_fiber_set_scheduler(VALUE klass, VALUE scheduler) +{ + // if (rb_scheduler_get() != Qnil) { + // rb_raise(rb_eFiberError, "Scheduler is already defined!"); + // } + + return rb_scheduler_set(scheduler); +} + static void rb_fiber_terminate(rb_fiber_t *fiber, int need_interrupt); void @@ -2178,6 +2200,18 @@ rb_fiber_blocking_p(VALUE fiber) return (fiber_ptr(fiber)->blocking == 0) ? Qfalse : Qtrue; } +static VALUE +rb_f_fiber_blocking_p(VALUE klass) +{ + rb_thread_t *thread = GET_THREAD(); + unsigned blocking = thread->blocking; + + if (blocking == 0) + return Qfalse; + + return INT2NUM(blocking); +} + void rb_fiber_close(rb_fiber_t *fiber) { @@ -2594,6 +2628,10 @@ Init_Cont(void) rb_define_method(rb_cFiber, "to_s", fiber_to_s, 0); rb_define_alias(rb_cFiber, "inspect", "to_s"); + rb_define_singleton_method(rb_cFiber, "blocking?", rb_f_fiber_blocking_p, 0); + rb_define_singleton_method(rb_cFiber, "scheduler", rb_fiber_scheduler, 0); + rb_define_singleton_method(rb_cFiber, "set_scheduler", rb_fiber_set_scheduler, 1); + rb_define_singleton_method(rb_cFiber, "schedule", rb_f_fiber, -1); //rb_define_global_function("Fiber", rb_f_fiber, -1); |