summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-fiber
diff options
context:
space:
mode:
authorYukihiro "Matz" Matsumoto <[email protected]>2013-05-23 15:24:31 +0900
committerYukihiro "Matz" Matsumoto <[email protected]>2013-05-23 15:24:31 +0900
commit76ddf86c72ccefefbeb2cd5dcf78c8365b1a2bcc (patch)
tree60f2dda2c46002f6592013926a9a487d2fc68252 /mrbgems/mruby-fiber
parent93d710117df22f99c2fd60632a77202a745a2b4a (diff)
downloadmruby-76ddf86c72ccefefbeb2cd5dcf78c8365b1a2bcc.tar.gz
mruby-76ddf86c72ccefefbeb2cd5dcf78c8365b1a2bcc.zip
manage fiber status (create|running|resumed|terminated)
Diffstat (limited to 'mrbgems/mruby-fiber')
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index c338b8b95..c98dd0e67 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -105,6 +105,7 @@ fiber_init(mrb_state *mrb, mrb_value self)
c->ci++; /* push dummy callinfo */
c->fib = f;
+ c->status = MRB_FIBER_CREATED;
return self;
}
@@ -153,8 +154,15 @@ fiber_resume(mrb_state *mrb, mrb_value self)
mrb_value *a;
int len;
+ if (c->status == MRB_FIBER_RESUMED) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "double resume");
+ }
+ if (c->status == MRB_FIBER_TERMINATED) {
+ mrb_raise(mrb, E_RUNTIME_ERROR, "resuming dead fiber");
+ }
mrb_get_args(mrb, "*", &a, &len);
- if (!c->prev) { /* first call */
+ mrb->c->status = MRB_FIBER_RESUMED;
+ if (c->status == MRB_FIBER_CREATED) {
mrb_value *b = c->stack+1;
mrb_value *e = b + len;
@@ -163,16 +171,15 @@ fiber_resume(mrb_state *mrb, mrb_value self)
}
c->ci->argc = len;
c->prev = mrb->c;
+ c->status = MRB_FIBER_RUNNING;
mrb->c = c;
MARK_CONTEXT_MODIFY(c);
return c->ci->proc->env->stack[0];
}
- if (c->ci == c->cibase) {
- mrb_raise(mrb, E_RUNTIME_ERROR, "resuming dead fiber");
- }
MARK_CONTEXT_MODIFY(c);
c->prev = mrb->c;
+ c->status = MRB_FIBER_RUNNING;
mrb->c = c;
return fiber_result(mrb, a, len);
}
@@ -198,8 +205,9 @@ fiber_yield(mrb_state *mrb, mrb_value self)
mrb_raise(mrb, E_ARGUMENT_ERROR, "can't yield from root fiber");
}
mrb_get_args(mrb, "*", &a, &len);
-
+ c->prev->status = MRB_FIBER_RUNNING;
mrb->c = c->prev;
+ c->prev = NULL;
MARK_CONTEXT_MODIFY(mrb->c);
return fiber_result(mrb, a, len);
}