diff --git a/mjit.c b/mjit.c index a45e155c4f..ef1a364ddd 100644 --- a/mjit.c +++ b/mjit.c @@ -1219,7 +1219,8 @@ worker(void) #ifndef _MSC_VER /* Combine .o files to one .so and reload all jit_func to improve memory locality */ - if ((unit_queue.length == 0 && active_units.length > 1) || active_units.length == mjit_opts.max_cache_size) { + if ((!mjit_opts.wait && unit_queue.length == 0 && active_units.length > 1) + || active_units.length == mjit_opts.max_cache_size) { compact_all_jit_code(); } #endif diff --git a/test/ruby/test_jit.rb b/test/ruby/test_jit.rb index 04b0a0b74a..5457bd3f45 100644 --- a/test/ruby/test_jit.rb +++ b/test/ruby/test_jit.rb @@ -9,7 +9,6 @@ class TestJIT < Test::Unit::TestCase IGNORABLE_PATTERNS = [ /\ASuccessful MJIT finish\n\z/, - /\AJIT compaction \(\d+\.\dms\): Compacted \d+ methods ->/, ] # trace_* insns are not compiled for now... @@ -549,8 +548,8 @@ class TestJIT < Test::Unit::TestCase end end; assert_equal('0123456789', out) - errs = err.lines.reject do |l| - IGNORABLE_PATTERNS.any? { |pat| pat.match?(l) } + compactions, errs = err.lines.partition do |l| + l.match?(/\AJIT compaction \(\d+\.\dms\): Compacted \d+ methods ->/) end assert_match(/\A#{JIT_SUCCESS_PREFIX}: block in
@-e:/, errs[0]) 9.times do |i| @@ -559,6 +558,10 @@ class TestJIT < Test::Unit::TestCase assert_equal("Too many JIT code -- 1 units unloaded\n", errs[10]) assert_match(/\A#{JIT_SUCCESS_PREFIX}: mjit9@\(eval\):/, errs[11]) + # On --jit-wait, when the number of JIT-ed code reaches --jit-max-cache, + # it should trigger compaction. + assert_equal(2, compactions.size) + # verify .o files are deleted on unload_units assert_send([Dir, :empty?, dir]) end