diff options
-rw-r--r-- | cont.c | 2 | ||||
-rw-r--r-- | test/ruby/test_fiber.rb | 11 |
2 files changed, 12 insertions, 1 deletions
@@ -248,7 +248,7 @@ cont_mark(void *ptr) const rb_thread_t *th = rb_thread_ptr(cont->saved_thread.self); const rb_fiber_t *fib = (rb_fiber_t*)cont; - if ((th->ec.fiber != fib) && FIBER_SUSPENDED_P(fib)) { + if ((th->ec.fiber != fib) && !FIBER_TERMINATED_P(fib)) { rb_gc_mark_locations(cont->machine.stack, cont->machine.stack + cont->machine.stack_size); } diff --git a/test/ruby/test_fiber.rb b/test/ruby/test_fiber.rb index 59290545f6..c9a0b58d70 100644 --- a/test/ruby/test_fiber.rb +++ b/test/ruby/test_fiber.rb @@ -217,6 +217,17 @@ class TestFiber < Test::Unit::TestCase }, bug4612 end + def test_mark_fiber + bug13875 = '[ruby-core:82681]' + + assert_normal_exit %q{ + GC.stress = true + up = 1.upto(10) + down = 10.downto(1) + up.zip(down) {|a, b| a + b == 11 or fail 'oops'} + }, bug13875 + end + def test_no_valid_cfp bug5083 = '[ruby-dev:44208]' assert_equal([], Fiber.new(&Module.method(:nesting)).resume, bug5083) |