diff options
| author | skandhas <[email protected]> | 2013-05-27 15:21:56 +0800 |
|---|---|---|
| committer | skandhas <[email protected]> | 2013-05-27 15:21:56 +0800 |
| commit | 345ba02e4d08b3fc966b9c094068c403e1acf3ae (patch) | |
| tree | bd431b577848725d99d2eba506768aa7875cdfce | |
| parent | 7b8ae1b8b64c281d983723d2c127f5713ad6e640 (diff) | |
| download | mruby-345ba02e4d08b3fc966b9c094068c403e1acf3ae.tar.gz mruby-345ba02e4d08b3fc966b9c094068c403e1acf3ae.zip | |
add Fiber#alive?
| -rw-r--r-- | mrbgems/mruby-fiber/src/fiber.c | 19 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/test/fiber.rb | 9 |
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) |
