summaryrefslogtreecommitdiff
path: root/test/lib/memory_status.rb
diff options
context:
space:
mode:
authorHiroshi SHIBATA <hsbt@ruby-lang.org>2019-06-29 19:43:47 +0900
committerHiroshi SHIBATA <hsbt@ruby-lang.org>2019-07-02 07:59:54 +0900
commitc3c0e3f5c9444c197779cb242de46dfffda79dec (patch)
tree03866471345f8c9baa68d548340199408aa51405 /test/lib/memory_status.rb
parent142617c8e1cad65fa483c5beb78ab40a99626a87 (diff)
Move to tool/lib from test/lib.
Diffstat (limited to 'test/lib/memory_status.rb')
-rw-r--r--test/lib/memory_status.rb149
1 files changed, 0 insertions, 149 deletions
diff --git a/test/lib/memory_status.rb b/test/lib/memory_status.rb
deleted file mode 100644
index ad002b2dda..0000000000
--- a/test/lib/memory_status.rb
+++ /dev/null
@@ -1,149 +0,0 @@
-# frozen_string_literal: true
-begin
- require '-test-/memory_status.so'
-rescue LoadError
-end
-
-module Memory
- keys = []
-
- case
- when File.exist?(procfile = "/proc/self/status") && (pat = /^Vm(\w+):\s+(\d+)/) =~ (data = File.binread(procfile))
- PROC_FILE = procfile
- VM_PAT = pat
- def self.read_status
- IO.foreach(PROC_FILE, encoding: Encoding::ASCII_8BIT) do |l|
- yield($1.downcase.intern, $2.to_i * 1024) if VM_PAT =~ l
- end
- end
-
- data.scan(pat) {|k, v| keys << k.downcase.intern}
-
- when /mswin|mingw/ =~ RUBY_PLATFORM
- require 'fiddle/import'
- require 'fiddle/types'
-
- module Win32
- extend Fiddle::Importer
- dlload "kernel32.dll", "psapi.dll"
- include Fiddle::Win32Types
- typealias "SIZE_T", "size_t"
-
- PROCESS_MEMORY_COUNTERS = struct [
- "DWORD cb",
- "DWORD PageFaultCount",
- "SIZE_T PeakWorkingSetSize",
- "SIZE_T WorkingSetSize",
- "SIZE_T QuotaPeakPagedPoolUsage",
- "SIZE_T QuotaPagedPoolUsage",
- "SIZE_T QuotaPeakNonPagedPoolUsage",
- "SIZE_T QuotaNonPagedPoolUsage",
- "SIZE_T PagefileUsage",
- "SIZE_T PeakPagefileUsage",
- ]
-
- typealias "PPROCESS_MEMORY_COUNTERS", "PROCESS_MEMORY_COUNTERS*"
-
- extern "HANDLE GetCurrentProcess()", :stdcall
- extern "BOOL GetProcessMemoryInfo(HANDLE, PPROCESS_MEMORY_COUNTERS, DWORD)", :stdcall
-
- module_function
- def memory_info
- size = PROCESS_MEMORY_COUNTERS.size
- data = PROCESS_MEMORY_COUNTERS.malloc
- data.cb = size
- data if GetProcessMemoryInfo(GetCurrentProcess(), data, size)
- end
- end
-
- keys << :peak << :size
- def self.read_status
- if info = Win32.memory_info
- yield :peak, info.PeakPagefileUsage
- yield :size, info.PagefileUsage
- end
- end
- when (require_relative 'find_executable'
- pat = /^\s*(\d+)\s+(\d+)$/
- pscmd = EnvUtil.find_executable("ps", "-ovsz=", "-orss=", "-p", $$.to_s) {|out| pat =~ out})
- pscmd.pop
- PAT = pat
- PSCMD = pscmd
-
- keys << :size << :rss
- def self.read_status
- if PAT =~ IO.popen(PSCMD + [$$.to_s], "r", err: [:child, :out], &:read)
- yield :size, $1.to_i*1024
- yield :rss, $2.to_i*1024
- end
- end
- else
- def self.read_status
- raise NotImplementedError, "unsupported platform"
- end
- end
-
- if !keys.empty?
- Status = Struct.new(*keys)
- end
-end unless defined?(Memory::Status)
-
-if defined?(Memory::Status)
- class Memory::Status
- def _update
- Memory.read_status do |key, val|
- self[key] = val
- end
- end unless method_defined?(:_update)
-
- Header = members.map {|k| k.to_s.upcase.rjust(6)}.join('')
- Format = "%6d"
-
- def initialize
- _update
- end
-
- def to_s
- status = each_pair.map {|n,v|
- "#{n}:#{v}"
- }
- "{#{status.join(",")}}"
- end
-
- def self.parse(str)
- status = allocate
- str.scan(/(?:\A\{|\G,)(#{members.join('|')}):(\d+)(?=,|\}\z)/) do
- status[$1] = $2.to_i
- end
- status
- end
- end
-
- # On some platforms (e.g. Solaris), libc malloc does not return
- # freed memory to OS because of efficiency, and linking with extra
- # malloc library is needed to detect memory leaks.
- #
- 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
- Memory::NO_MEMORY_LEAK_ENVS = envs
- end
- end
- end #case RUBY_PLATFORM
-
-end