summaryrefslogtreecommitdiffhomepage
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-11-04 23:58:32 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-11-04 23:58:32 +0900
commite386760cc7b7958a8948b0a23b35b3a9df30c354 (patch)
treeab7a023e426242ac22ec4f57b2ba8324eaa0e5d6
parentfb831b6a5e7282612d802979c5012e038ab0ad0b (diff)
downloadmruby-e386760cc7b7958a8948b0a23b35b3a9df30c354.tar.gz
mruby-e386760cc7b7958a8948b0a23b35b3a9df30c354.zip
add Fiber.current
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c21
-rw-r--r--src/gc.c3
2 files changed, 23 insertions, 1 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index c764b4786..757eb235d 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -232,6 +232,26 @@ fiber_yield(mrb_state *mrb, mrb_value self)
return fiber_result(mrb, a, len);
}
+/*
+ * call-seq:
+ * Fiber.current() -> fiber
+ *
+ * Returns the current fiber. You need to <code>require 'fiber'</code>
+ * before using this method. If you are not running in the context of
+ * a fiber this method will return the root fiber.
+ */
+static mrb_value
+fiber_current(mrb_state *mrb, mrb_value self)
+{
+ if (!mrb->c->fib) {
+ struct RFiber *f = (struct RFiber*)mrb_obj_alloc(mrb, MRB_TT_FIBER, mrb_class_ptr(self));
+
+ f->cxt = mrb->c;
+ mrb->c->fib = f;
+ }
+ return mrb_obj_value(mrb->c->fib);
+}
+
void
mrb_mruby_fiber_gem_init(mrb_state* mrb)
{
@@ -245,6 +265,7 @@ mrb_mruby_fiber_gem_init(mrb_state* mrb)
mrb_define_method(mrb, c, "alive?", fiber_alive_p, MRB_ARGS_NONE());
mrb_define_class_method(mrb, c, "yield", fiber_yield, MRB_ARGS_ANY());
+ mrb_define_class_method(mrb, c, "current", fiber_current, MRB_ARGS_NONE());
}
void
diff --git a/src/gc.c b/src/gc.c
index 361024af3..ccd925da8 100644
--- a/src/gc.c
+++ b/src/gc.c
@@ -619,7 +619,8 @@ obj_free(mrb_state *mrb, struct RBasic *obj)
{
struct mrb_context *c = ((struct RFiber*)obj)->cxt;
- mrb_free_context(mrb, c);
+ if (c != mrb->root_c)
+ mrb_free_context(mrb, c);
}
break;