1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

Fix order of operations during rb_ec_finalize.

This commit is contained in:
Samuel Williams 2020-09-30 15:24:36 +13:00
parent 48b94b7919
commit 388281c5c9
Notes: git 2020-09-30 12:35:11 +09:00
2 changed files with 23 additions and 4 deletions

13
eval.c
View file

@ -162,7 +162,11 @@ static void
rb_ec_scheduler_finalize(rb_execution_context_t *ec)
{
rb_thread_t *thread = rb_ec_thread_ptr(ec);
rb_thread_scheduler_set(thread->self, Qnil);
EC_PUSH_TAG(ec);
if (EC_EXEC_TAG() == TAG_NONE) {
rb_thread_scheduler_set(thread->self, Qnil);
}
EC_POP_TAG();
}
static void
@ -217,6 +221,10 @@ rb_ec_cleanup(rb_execution_context_t *ec, volatile int ex)
rb_threadptr_interrupt(th);
rb_threadptr_check_signal(th);
// If the user code defined a scheduler for the top level thread, run it:
rb_ec_scheduler_finalize(ec);
EC_PUSH_TAG(ec);
if ((state = EC_EXEC_TAG()) == TAG_NONE) {
th = th0;
@ -278,9 +286,6 @@ rb_ec_cleanup(rb_execution_context_t *ec, volatile int ex)
}
}
// If the user code defined a scheduler for the top level thread, run it:
rb_ec_scheduler_finalize(ec);
mjit_finish(true); // We still need ISeqs here.
rb_ec_finalize(ec);

View file

@ -35,4 +35,18 @@ class TestFiberScheduler < Test::Unit::TestCase
thread.join
end
def test_close_at_exit
assert_in_out_err %W[-I#{__dir__} -], <<-RUBY, ['Running Fiber'], [], success: true
require 'scheduler'
scheduler = Scheduler.new
Thread.current.scheduler = scheduler
Fiber.schedule do
sleep(0)
puts "Running Fiber"
end
RUBY
end
end