aboutsummaryrefslogtreecommitdiffstats
path: root/cont.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 /cont.c
parent656d4cddaf2debd0c66b9bd980f51bcbf0849bd6 (diff)
downloadruby-a08ee8330d3d739467bfa34deeb797d83e59ed3c.tar.gz
Rename to `Fiber#set_scheduler`.
Diffstat (limited to 'cont.c')
-rw-r--r--cont.c44
1 files changed, 41 insertions, 3 deletions
diff --git a/cont.c b/cont.c
index 2c3c7d38ea..8d13988df9 100644
--- a/cont.c
+++ b/cont.c
@@ -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);