diff options
author | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-08-04 23:33:38 +0000 |
---|---|---|
committer | normal <normal@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-08-04 23:33:38 +0000 |
commit | ff1e665729d7bf6e3f3d17b0f5eb614b78bef341 (patch) | |
tree | 7bdd284bdb3abd2374c55d70bc0a1bc4c529f0b5 | |
parent | 80e973f0e61a843f9e76c280fce327e070da7dab (diff) | |
download | ruby-ff1e665729d7bf6e3f3d17b0f5eb614b78bef341.tar.gz |
test/ruby/test_io.rb (test_select_leak): speedup and reduce memory use
We can reuse the sub-thread and exception with Thread#raise to
reproduce the old memory leak with less overhead. This allows
us to to run more iterations and improve reliability of the
actual test, particularly on platforms without USE_THREAD_CACHE.
For glibc and jemalloc, also limit arena count to avoid
inadvertant growth.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@64187 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r-- | test/ruby/test_io.rb | 25 |
1 files changed, 20 insertions, 5 deletions
diff --git a/test/ruby/test_io.rb b/test/ruby/test_io.rb index d6bdc7f811..d71efeb8a2 100644 --- a/test/ruby/test_io.rb +++ b/test/ruby/test_io.rb @@ -3804,18 +3804,33 @@ __END__ def test_select_leak skip 'MJIT uses too much memory' if RubyVM::MJIT.enabled? - assert_no_memory_leak([], <<-"end;", <<-"end;", rss: true, timeout: 60) + # avoid malloc arena explosion from glibc and jemalloc: + env = { + 'MALLOC_ARENA_MAX' => '1', + 'MALLOC_ARENA_TEST' => '1', + 'MALLOC_CONF' => 'narenas:1', + } + assert_no_memory_leak([env], <<-"end;", <<-"end;", rss: true, timeout: 60) r, w = IO.pipe rset = [r] wset = [w] + exc = StandardError.new(-"select used to leak on exception") + exc.set_backtrace([]) Thread.new { IO.select(rset, wset, nil, 0) }.join end; - 20_000.times do - th = Thread.new { IO.select(rset, wset) } + th = Thread.new do + begin + IO.select(rset, wset) + rescue => e + retry + end while true + end + 50_000.times do Thread.pass until th.stop? - th.kill - th.join + th.raise(exc) end + th.kill + th.join end; end end |