diff options
-rw-r--r-- | mjit.c | 2 | ||||
-rw-r--r-- | test/ruby/test_rubyvm_mjit.rb | 12 |
2 files changed, 13 insertions, 1 deletions
@@ -647,7 +647,7 @@ mjit_pause(int wait_p) tv.tv_sec = 0; tv.tv_usec = 1000; - while (unit_queue.length > 0) { + while (unit_queue.length > 0 && active_units.length < mjit_opts.max_cache_size) { /* inverse of condition that waits for mjit_worker_wakeup */ CRITICAL_SECTION_START(3, "in mjit_pause for a worker wakeup"); rb_native_cond_broadcast(&mjit_worker_wakeup); CRITICAL_SECTION_FINISH(3, "in mjit_pause for a worker wakeup"); diff --git a/test/ruby/test_rubyvm_mjit.rb b/test/ruby/test_rubyvm_mjit.rb index ce4940ba2d..b41ad78510 100644 --- a/test/ruby/test_rubyvm_mjit.rb +++ b/test/ruby/test_rubyvm_mjit.rb @@ -33,6 +33,18 @@ class TestRubyVMMJIT < Test::Unit::TestCase ) end + def test_pause_does_not_hang_on_full_units + out, _ = eval_with_jit(<<~'EOS', verbose: 1, min_calls: 1, max_cache: 10, wait: false) + i = 0 + while i < 11 + eval("def mjit#{i}; end; mjit#{i}") + i += 1 + end + print RubyVM::MJIT.pause + EOS + assert_equal('true', out) + end + def test_pause_wait_false out, err = eval_with_jit(<<~'EOS', verbose: 1, min_calls: 1, wait: false) i = 0 |