diff options
author | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-30 15:24:36 +1300 |
---|---|---|
committer | Samuel Williams <samuel.williams@oriontransfer.co.nz> | 2020-09-30 16:34:38 +1300 |
commit | 388281c5c92d4c04bfb08aeac7513770de9ea128 (patch) | |
tree | a6bb09ae1b7387222b6ba1a8bbf1db22bcab688f | |
parent | 48b94b791997881929c739c64f95ac30f3fd0bb9 (diff) |
Fix order of operations during `rb_ec_finalize`.
Notes
Notes:
Merged: https://github.com/ruby/ruby/pull/3605
-rw-r--r-- | eval.c | 13 | ||||
-rw-r--r-- | test/fiber/test_scheduler.rb | 14 |
2 files changed, 23 insertions, 4 deletions
@@ -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); diff --git a/test/fiber/test_scheduler.rb b/test/fiber/test_scheduler.rb index 0e70585a9c..23b59c06b0 100644 --- a/test/fiber/test_scheduler.rb +++ b/test/fiber/test_scheduler.rb @@ -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 |