summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c19
-rw-r--r--mrbgems/mruby-fiber/test/fiber.rb9
2 files changed, 26 insertions, 2 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 317fdb06a..d5855caa3 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -190,6 +190,20 @@ fiber_resume(mrb_state *mrb, mrb_value self)
/*
* call-seq:
+ * fiber.alive? -> true or false
+ *
+ * Returns true if the fiber can still be resumed. After finishing
+ * execution of the fiber block this method will always return false.
+ */
+static mrb_value
+fiber_alive_p(mrb_state *mrb, mrb_value self)
+{
+ struct mrb_context *c = fiber_check(mrb, self);
+ return mrb_bool_value(c->status != MRB_FIBER_TERMINATED);
+}
+
+/*
+ * call-seq:
* Fiber.yield(args, ...) -> obj
*
* Yields control back to the context that resumed the fiber, passing
@@ -224,8 +238,9 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb)
c = mrb_define_class(mrb, "Fiber", mrb->object_class);
MRB_SET_INSTANCE_TT(c, MRB_TT_FIBER);
- mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE());
- mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY());
+ mrb_define_method(mrb, c, "initialize", fiber_init, MRB_ARGS_NONE());
+ mrb_define_method(mrb, c, "resume", fiber_resume, MRB_ARGS_ANY());
+ mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE());
mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY());
}
diff --git a/mrbgems/mruby-fiber/test/fiber.rb b/mrbgems/mruby-fiber/test/fiber.rb
index 0b20cb591..fc3e02e88 100644
--- a/mrbgems/mruby-fiber/test/fiber.rb
+++ b/mrbgems/mruby-fiber/test/fiber.rb
@@ -8,6 +8,15 @@ assert('Fiber#resume') {
f.resume(2)
}
+assert('Fiber#alive?') {
+ f = Fiber.new{ Fiber.yield }
+ f.resume
+ r1 = f.alive?
+ f.resume
+ r2 = f.alive?
+ r1 == true and r2 == false
+}
+
assert('Fiber.yield') {
f = Fiber.new{|x| Fiber.yield(x == 3)}
f.resume(3)