summaryrefslogtreecommitdiff
path: root/test
diff options
context:
space:
mode:
authorngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-11 16:32:07 +0000
committerngoto <ngoto@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2014-07-11 16:32:07 +0000
commitca1c23e2a74da7cccb89fd75b95fee87f5b52fb0 (patch)
tree385019f60e7c80ce1ec04620e843a4d2736dd243 /test
parent47adf5709ac68d483a7ea159195a5265f164bfea (diff)
* test/ruby/envutil.rb (assert_no_memory_leak): On Solaris 9 or later,
if possible, execute child ruby with environment variables LD_PRELOAD=libumem.so UMEM_OPTIONS="backend=mmap". With these variables, freed memory is immediately returned to the OS. [Bug #10020] [ruby-dev:48391] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@46791 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'test')
-rw-r--r--test/ruby/envutil.rb28
1 files changed, 28 insertions, 0 deletions
diff --git a/test/ruby/envutil.rb b/test/ruby/envutil.rb
index 6ba77de053..bbfdbf6d22 100644
--- a/test/ruby/envutil.rb
+++ b/test/ruby/envutil.rb
@@ -408,6 +408,29 @@ eom
assert_warning(*args) {$VERBOSE = false; yield}
end
+ case RUBY_PLATFORM
+ when /solaris2\.(?:9|[1-9][0-9])/i # Solaris 9, 10, 11,...
+ bits = [nil].pack('p').size == 8 ? 64 : 32
+ if ENV['LD_PRELOAD'].to_s.empty? &&
+ ENV["LD_PRELOAD_#{bits}"].to_s.empty? &&
+ (ENV['UMEM_OPTIONS'].to_s.empty? ||
+ ENV['UMEM_OPTIONS'] == 'backend=mmap') then
+ envs = {
+ 'LD_PRELOAD' => 'libumem.so',
+ 'UMEM_OPTIONS' => 'backend=mmap'
+ }
+ args = [
+ envs,
+ "--disable=gems",
+ "-v", "-",
+ ]
+ _, err, status = EnvUtil.invoke_ruby(args, "exit(0)", true, true)
+ if status.exitstatus == 0 && err.to_s.empty? then
+ NO_MEMORY_LEAK_ENVS = envs
+ end
+ end
+ end #case RUBY_PLATFORM
+
def assert_no_memory_leak(args, prepare, code, message=nil, limit: 1.5, rss: false, **opt)
require_relative 'memory_status'
token = "\e[7;1m#{$$.to_s}:#{Time.now.strftime('%s.%L')}:#{rand(0x10000).to_s(16)}:\e[m"
@@ -420,6 +443,11 @@ eom
*args,
"-v", "-",
]
+ if defined? NO_MEMORY_LEAK_ENVS then
+ envs ||= {}
+ newenvs = envs.merge(NO_MEMORY_LEAK_ENVS) { |_, _, _| break }
+ envs = newenvs if newenvs
+ end
args.unshift(envs) if envs
cmd = [
'END {STDERR.puts '"#{token_dump}"'"FINAL=#{Memory::Status.new}"}',