diff options
| author | take_cheeze <[email protected]> | 2014-03-19 01:01:50 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-03-19 01:05:21 +0900 |
| commit | 19c4bf6fcba44af060f52656db682fe7cfcbe690 (patch) | |
| tree | 1bc1553f30109234e510b304f54d2d95c74ce529 /mrbgems/mruby-fiber | |
| parent | 792c1add0cc44a60ecad661b86fd16bf773a5d58 (diff) | |
| download | mruby-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.c | 5 | ||||
| -rw-r--r-- | mrbgems/mruby-fiber/test/fiber.rb | 6 |
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 |
