leak_profiler 0.4.1 → 0.5.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA256:
3
- metadata.gz: 386f532ac6ac35f8f971e9fcc94d29e98d509feb16ffa49f471235e07f74fe64
4
- data.tar.gz: 138da4ee3ac1cd9e2057e3be13e955a3d0ea044426de4bca298ae8255bd62777
3
+ metadata.gz: 3e7942b0713d364d60dcfbeb171894c69aa63028adc6795d4b48e85d6019152d
4
+ data.tar.gz: '05967d0eefaf0301b380620c23b5eb925ac62a26ad45c1504a7ff2e6690f537a'
5
5
  SHA512:
6
- metadata.gz: 6d02acbee4be5c1ea02e22cff0ad8653a5028be7b660bfac35533c75eca52d6eb040d596e817117c189e72318c79b60bd0ee17ffe499e273c5f98ea8d1e872d6
7
- data.tar.gz: 06aee1fc3dac01bf958d60870bfdd82debcc4605f2589b4477435e9f6955c2035d4cf220d718673074c633e1209e823e420e2ab8499d60805b5fe46f8e652eee
6
+ metadata.gz: b430a5fe0d7ad6fc90d1dd1f949aeb0b2948487a6f651b4c52975774b4e5cb21ab98a9f7219e8c665f90daa3c70f6aa3d3c803ffdc9aa48acddd0e0e95d8bf15
7
+ data.tar.gz: 175e865aa10c22816d9b86c04301a0c574af0260becbe3fdf76b78d8f338b466fdc2170431a4244e0296ed47b27223879e52c60060363654f1adc8da7cd49638
data/.rubocop.yml CHANGED
@@ -14,6 +14,9 @@ Metrics:
14
14
  Style/Copyright:
15
15
  Enabled: false
16
16
 
17
+ Style/GlobalVars:
18
+ Enabled: false
19
+
17
20
  Style/ImplicitRuntimeError:
18
21
  Enabled: false
19
22
 
data/Rakefile CHANGED
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'bundler/gem_tasks'
4
+ require 'rake/extensiontask'
4
5
  require 'rake/testtask'
5
6
 
6
- task default: :test
7
+ task default: %i[compile test]
8
+
9
+ Rake::ExtensionTask.new('leak_profiler_ext') do |ext|
10
+ ext.ext_dir = 'ext/leak_profiler'
11
+ end
7
12
 
8
13
  Rake::TestTask.new do |task|
9
14
  task.pattern = 'test/test_*.rb'
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'mkmf'
4
+
5
+ $LDFLAGS += ' -lpsapi' if RUBY_PLATFORM.include?('mingw')
6
+
7
+ create_makefile('leak_profiler_ext')
@@ -0,0 +1,37 @@
1
+ #include "ruby.h"
2
+
3
+ #if defined(_WIN32)
4
+ #include <psapi.h>
5
+
6
+ static VALUE leak_profiler_max_rss(VALUE self)
7
+ {
8
+ PROCESS_MEMORY_COUNTERS pmc;
9
+ if (!GetProcessMemoryInfo(GetCurrentProcess(), &pmc, sizeof(pmc))) {
10
+ rb_sys_fail("GetProcessMemoryInfo");
11
+ }
12
+ return LONG2NUM(pmc.PeakWorkingSetSize);
13
+ }
14
+
15
+ #else
16
+ #include <sys/resource.h>
17
+
18
+ static VALUE leak_profiler_max_rss(VALUE self)
19
+ {
20
+ struct rusage usage;
21
+ if (getrusage(RUSAGE_SELF, &usage) == -1) {
22
+ rb_sys_fail("getrusage");
23
+ }
24
+
25
+ return LONG2NUM(usage.ru_maxrss);
26
+ }
27
+
28
+ #endif
29
+
30
+ void Init_leak_profiler_ext(void)
31
+ {
32
+ VALUE cLeakProfiler = rb_define_class("LeakProfiler", rb_cObject);
33
+ VALUE cMemoryUsage = rb_define_class_under(cLeakProfiler, "MemoryUsage", rb_cObject);
34
+
35
+
36
+ rb_define_singleton_method(cMemoryUsage, "max_rss", leak_profiler_max_rss, 0);
37
+ }
@@ -1,11 +1,17 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  require 'objspace'
4
6
 
5
7
  class LeakProfiler
6
8
  class Allocations
7
9
  attr_reader :thread
8
10
 
11
+ # @rbs logger: untyped
12
+ # @rbs interval: Integer
13
+ # @rbs max_allocations: Integer
14
+ # @rbs max_referrers: Integer
9
15
  def initialize(logger:, interval:, max_allocations:, max_referrers:)
10
16
  @logger = logger
11
17
  @interval = interval
@@ -1,11 +1,16 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  require 'objspace'
4
6
 
5
7
  class LeakProfiler
6
8
  class MemoryMemsize
7
9
  attr_reader :thread
8
10
 
11
+ # @rbs output_dir: String
12
+ # @rbs interval: Integer
13
+ # @rbs filename: String
9
14
  def initialize(output_dir:, interval:, filename: nil)
10
15
  @output_dir = output_dir
11
16
  @interval = interval
@@ -1,9 +1,14 @@
1
1
  # frozen_string_literal: true
2
2
 
3
+ # rbs_inline: enabled
4
+
3
5
  class LeakProfiler
4
6
  class MemoryUsage
5
7
  attr_reader :thread
6
8
 
9
+ # @rbs output_dir: String
10
+ # @rbs interval: Integer
11
+ # @rbs filename: String
7
12
  def initialize(output_dir:, interval:, filename: nil)
8
13
  @output_dir = output_dir
9
14
  @interval = interval
@@ -11,17 +16,13 @@ class LeakProfiler
11
16
  end
12
17
 
13
18
  def report
14
- raise('Not supported Windows platform because this uses `ps` command for measurement.') if /mingw/.match?(RUBY_PLATFORM)
15
-
16
- pid = Process.pid
17
-
18
19
  @thread = Thread.start do
19
20
  i = 0
20
21
  File.open(File.expand_path(File.join(@output_dir, @filename)), 'w') do |f|
21
22
  f.puts('elapsed [sec],memory usage (rss) [MB]')
22
23
 
23
24
  loop do
24
- rss = Integer(`ps -o rss= -p #{pid}`) / 1024.0
25
+ rss = LeakProfiler::MemoryUsage.max_rss / 1024.0
25
26
  f.puts("#{i},#{rss}")
26
27
  f.fsync
27
28
  i += @interval
data/lib/leak_profiler.rb CHANGED
@@ -1,3 +1,4 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  require 'leak_profiler/leak_profiler'
4
+ require_relative 'leak_profiler_ext.so'
@@ -0,0 +1,27 @@
1
+ # Generated from lib/leak_profiler/allocations.rb with RBS::Inline
2
+
3
+ class LeakProfiler
4
+ class Allocations
5
+ attr_reader thread: untyped
6
+
7
+ # @rbs logger: untyped
8
+ # @rbs interval: Integer
9
+ # @rbs max_allocations: Integer
10
+ # @rbs max_referrers: Integer
11
+ def initialize: (logger: untyped, interval: Integer, max_allocations: Integer, max_referrers: Integer) -> untyped
12
+
13
+ def report: () -> untyped
14
+
15
+ private
16
+
17
+ def report_allocations: (untyped allocations) -> untyped
18
+
19
+ def report_referrer_objects: (untyped allocations) -> untyped
20
+
21
+ def detect_referrer_objects: (untyped object) -> untyped
22
+
23
+ def allocated_location: (untyped obj) -> untyped
24
+
25
+ def sort: (untyped allocations) -> untyped
26
+ end
27
+ end
@@ -0,0 +1,14 @@
1
+ # Generated from lib/leak_profiler/memory_memsize.rb with RBS::Inline
2
+
3
+ class LeakProfiler
4
+ class MemoryMemsize
5
+ attr_reader thread: untyped
6
+
7
+ # @rbs output_dir: String
8
+ # @rbs interval: Integer
9
+ # @rbs filename: String
10
+ def initialize: (output_dir: String, interval: Integer, ?filename: String) -> untyped
11
+
12
+ def report: () -> untyped
13
+ end
14
+ end
@@ -0,0 +1,14 @@
1
+ # Generated from lib/leak_profiler/memory_usage.rb with RBS::Inline
2
+
3
+ class LeakProfiler
4
+ class MemoryUsage
5
+ attr_reader thread: untyped
6
+
7
+ # @rbs output_dir: String
8
+ # @rbs interval: Integer
9
+ # @rbs filename: String
10
+ def initialize: (output_dir: String, interval: Integer, ?filename: String) -> untyped
11
+
12
+ def report: () -> untyped
13
+ end
14
+ end
@@ -0,0 +1,5 @@
1
+ class LeakProfiler
2
+ class MemoryUsage
3
+ def self.max_rss: () -> Integer
4
+ end
5
+ end
@@ -0,0 +1,10 @@
1
+ # frozen_string_literal: true
2
+
3
+ require 'leak_profiler'
4
+ require 'minitest/autorun'
5
+
6
+ class MemoryUsageTest < Minitest::Test
7
+ def test_report_rss
8
+ assert_equal(true, LeakProfiler::MemoryUsage.max_rss.positive?)
9
+ end
10
+ end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: leak_profiler
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.1
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Watson
@@ -27,7 +27,8 @@ description: A simple profiler for Ruby to detect memory leak.
27
27
  email:
28
28
  - watson1978@gmail.com
29
29
  executables: []
30
- extensions: []
30
+ extensions:
31
+ - ext/leak_profiler/extconf.rb
31
32
  extra_rdoc_files: []
32
33
  files:
33
34
  - ".rubocop.yml"
@@ -35,13 +36,20 @@ files:
35
36
  - LICENSE
36
37
  - README.md
37
38
  - Rakefile
39
+ - ext/leak_profiler/extconf.rb
40
+ - ext/leak_profiler/leak_profiler.c
38
41
  - lib/leak_profiler.rb
39
42
  - lib/leak_profiler/allocations.rb
40
43
  - lib/leak_profiler/leak_profiler.rb
41
44
  - lib/leak_profiler/memory_memsize.rb
42
45
  - lib/leak_profiler/memory_usage.rb
46
+ - sig/generated/leak_profiler/allocations.rbs
43
47
  - sig/generated/leak_profiler/leak_profiler.rbs
48
+ - sig/generated/leak_profiler/memory_memsize.rbs
49
+ - sig/generated/leak_profiler/memory_usage.rbs
50
+ - sig/leak_profiler.rbs
44
51
  - test/test_leak_profiler.rb
52
+ - test/test_memory_usage.rb
45
53
  homepage: https://github.com/Watson1978/leak_profiler
46
54
  licenses:
47
55
  - MIT