summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-fiber/src
diff options
context:
space:
mode:
authortake_cheeze <[email protected]>2014-03-19 01:01:50 +0900
committertake_cheeze <[email protected]>2014-03-19 01:05:21 +0900
commit19c4bf6fcba44af060f52656db682fe7cfcbe690 (patch)
tree1bc1553f30109234e510b304f54d2d95c74ce529 /mrbgems/mruby-fiber/src
parent792c1add0cc44a60ecad661b86fd16bf773a5d58 (diff)
downloadmruby-19c4bf6fcba44af060f52656db682fe7cfcbe690.tar.gz
mruby-19c4bf6fcba44af060f52656db682fe7cfcbe690.zip
revert MRB_FIBER_RESUMED as MRB_FIBER_RESUMING to fix recurive resume
Diffstat (limited to 'mrbgems/mruby-fiber/src')
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c5
1 files changed, 2 insertions, 3 deletions
diff --git a/mrbgems/mruby-fiber/src/fiber.c b/mrbgems/mruby-fiber/src/fiber.c
index 1a166f6f5..0a6e0cdd5 100644
--- a/mrbgems/mruby-fiber/src/fiber.c
+++ b/mrbgems/mruby-fiber/src/fiber.c
@@ -164,13 +164,14 @@ fiber_resume(mrb_state *mrb, mrb_value self)
mrb_raise(mrb, E_ARGUMENT_ERROR, "can't cross C function boundary");
}
}
- if (c->status == MRB_FIBER_RUNNING || (mrb->c->prev && mrb->c->prev != mrb->root_c)) {
+ if (c->status == MRB_FIBER_RUNNING || c->status == MRB_FIBER_RESUMING) {
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);
+ mrb->c->status = MRB_FIBER_RESUMING;
if (c->status == MRB_FIBER_CREATED) {
mrb_value *b = c->stack+1;
mrb_value *e = b + len;
@@ -183,7 +184,6 @@ fiber_resume(mrb_state *mrb, mrb_value self)
if (c->prev->fib)
mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
mrb_write_barrier(mrb, (struct RBasic*)c->fib);
- mrb->c->status = MRB_FIBER_SUSPENDED;
c->status = MRB_FIBER_RUNNING;
mrb->c = c;
@@ -195,7 +195,6 @@ fiber_resume(mrb_state *mrb, mrb_value self)
if (c->prev->fib)
mrb_field_write_barrier(mrb, (struct RBasic*)c->fib, (struct RBasic*)c->prev->fib);
mrb_write_barrier(mrb, (struct RBasic*)c->fib);
- mrb->c->status = MRB_FIBER_SUSPENDED;
c->status = MRB_FIBER_RUNNING;
mrb->c = c;
return fiber_result(mrb, a, len);