summaryrefslogtreecommitdiffhomepage
path: root/mrbgems/mruby-fiber
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
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')
-rw-r--r--mrbgems/mruby-fiber/src/fiber.c5
-rw-r--r--mrbgems/mruby-fiber/test/fiber.rb6
2 files changed, 7 insertions, 4 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);
diff --git a/mrbgems/mruby-fiber/test/fiber.rb b/mrbgems/mruby-fiber/test/fiber.rb
index 8838208f6..a99041f4a 100644
--- a/mrbgems/mruby-fiber/test/fiber.rb
+++ b/mrbgems/mruby-fiber/test/fiber.rb
@@ -96,8 +96,12 @@ assert('Recursive resume of Fiber') do
f1.resume
Fiber.yield 0
}
- assert_equal 0, f2.resume
+ f3 = Fiber.new {
+ f2.resume
+ }
+ assert_equal 0, f3.resume
f2.resume
assert_false f1.alive?
assert_false f2.alive?
+ assert_false f3.alive?
end