allocation_tracer 0.4.3 → 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
  SHA1:
3
- metadata.gz: 3dc53bab30ca77dc661da7cc1d75b0c2ac07881f
4
- data.tar.gz: cf61afd7c08c2898d4454002679f29c024e83646
3
+ metadata.gz: 00e9bb56504e9d79f1182f199aa74bcae77f8452
4
+ data.tar.gz: 1847dac5c208e05f9e9bc05669d3371082fb0997
5
5
  SHA512:
6
- metadata.gz: 859f36690133321cc4de4378e115de5ecd6a0a7e0b3793fa728fe41c9c5ad4e918025337b844410c8fca43b8c310e37e0cf785ff2658843ebacc68a0e77c56c3
7
- data.tar.gz: defdaa389a03387009e8b29b6232252349db69a035a6618ec27a462d6d45091a7a0a9dc37ef483243d34bf49d36d0b7bab010d5af9c9442a678b55d3fc182fec
6
+ metadata.gz: fe772a13c725eb2aa94e50dbafbca0a9a1a05113f69b951150437ad6dd4d38237ccd5eaaef3ce36241ca823a3527b77b4628feaa2d30d62da8cbdae63dfe62bd
7
+ data.tar.gz: 307ba703a9026f632601defaf9da8cd220f9334b1f5286622f64457496ee9696f723a5021dc7db472dac2f84fd17d8268321d8571516b230b23ce82b648c61e2
data/.travis.yml CHANGED
@@ -1,4 +1,4 @@
1
1
  language: ruby
2
2
  rvm:
3
3
  - 2.1.0
4
-
4
+ - 2.2.0
data/README.md CHANGED
@@ -213,6 +213,30 @@ Note that these numbers includes living objects and dead objects. For
213
213
  dead objects, age means lifetime. For living objects, age means
214
214
  current age.
215
215
 
216
+ ## Rack middleware
217
+
218
+ You can use
219
+
220
+ ```ruby
221
+ require 'rack'
222
+ require 'sinatra'
223
+ require 'rack/allocation_tracer'
224
+
225
+ use Rack::AllocationTracerMiddleware
226
+
227
+ get '/' do
228
+ 'foo'
229
+ end
230
+ ```
231
+
232
+ When you access to `http://host/allocation_tracer/` then you can see table of allocation tracer.
233
+
234
+ You can access the following pages.
235
+
236
+ * http://host/allocation_tracer/
237
+ * http://host/allocation_tracer/allocated_count_table
238
+ * http://host/allocation_tracer/freed_count_table_page
239
+
216
240
  ## Contributing
217
241
 
218
242
  1. Fork it ( http://github.com/ko1/allocation_tracer/fork )
@@ -102,9 +102,10 @@ delete_unique_str(st_table *tbl, const char *str)
102
102
  if (str) {
103
103
  st_data_t n;
104
104
 
105
- st_lookup(tbl, (st_data_t)str, &n);
105
+ if (st_lookup(tbl, (st_data_t)str, &n) == 0) rb_bug("delete_unique_str: unreachable");
106
+
106
107
  if (n == 1) {
107
- st_delete(tbl, (st_data_t *)&str, 0);
108
+ st_delete(tbl, (st_data_t *)&str, NULL);
108
109
  ruby_xfree((char *)str);
109
110
  }
110
111
  else {
@@ -522,6 +523,9 @@ type_sym(int type)
522
523
  TYPE_NAME(T_SYMBOL);
523
524
  TYPE_NAME(T_FIXNUM);
524
525
  TYPE_NAME(T_UNDEF);
526
+ #ifdef T_IMEMO /* introduced from Rub 2.3 */
527
+ TYPE_NAME(T_IMEMO);
528
+ #endif
525
529
  TYPE_NAME(T_NODE);
526
530
  TYPE_NAME(T_ICLASS);
527
531
  TYPE_NAME(T_ZOMBIE);
@@ -559,7 +563,6 @@ aggregate_result_i(st_data_t key, st_data_t val, void *data)
559
563
  const char *path = (const char *)key_buff->data[i++];
560
564
  if (path) {
561
565
  rb_ary_push(k, rb_str_new2(path));
562
- delete_unique_str(arg->str_table, path);
563
566
  }
564
567
  else {
565
568
  rb_ary_push(k, Qnil);
@@ -1,3 +1,3 @@
1
1
  module ObjectSpace::AllocationTracer
2
- VERSION = "0.4.3"
2
+ VERSION = "0.5.0"
3
3
  end
@@ -0,0 +1,92 @@
1
+ #
2
+ # Rack middleware
3
+ #
4
+
5
+ require 'allocation_tracer'
6
+
7
+ module Rack
8
+ module AllocationTracerMiddleware
9
+ def self.new *args
10
+ TotalTracer.new *args
11
+ end
12
+
13
+ class Tracer
14
+ def initialize app
15
+ @app = app
16
+ @sort_order = (0..7).to_a
17
+ end
18
+
19
+ def allocation_trace_page result
20
+ table = result.map{|(file, line, klass), (count, oldcount, total_age, min_age, max_age, memsize)|
21
+ ["#{Rack::Utils.escape_html(file)}:#{'%04d' % line}",
22
+ klass ? klass.name : '<internal>',
23
+ count, oldcount, total_age / Float(count), min_age, max_age, memsize]
24
+ }.sort_by{|vs|
25
+ ary = @sort_order.map{|i| Numeric === vs[i] ? -vs[i] : vs[i]}
26
+ }
27
+
28
+ headers = %w(path class count old_count average_age max_age min_age memsize).map.with_index{|e, i|
29
+ "<th><a href='./?s=#{i}'>#{e}</a></th>"
30
+ }.join("\n")
31
+ header = "<tr>#{headers}</tr>"
32
+ body = table.map{|cols|
33
+ "<tr>" + cols.map{|c| "<td>#{c}</td>"}.join("\n") + "</tr>"
34
+ }.join("\n")
35
+ "<table>#{header}#{body}</table>"
36
+ end
37
+
38
+ def count_table_page count_table
39
+ text = count_table.map{|k, v| "%-10s\t%8d" % [k, v]}.join("\n")
40
+ "<pre>#{text}</pre>"
41
+ end
42
+
43
+ def allocated_count_table_page
44
+ count_table_page ObjectSpace::AllocationTracer.allocated_count_table
45
+ end
46
+
47
+ def freed_count_table_page
48
+ count_table_page ObjectSpace::AllocationTracer.freed_count_table
49
+ end
50
+
51
+ def call env
52
+ if /\A\/allocation_tracer\// =~ env["PATH_INFO"]
53
+ result = ObjectSpace::AllocationTracer.result
54
+ ObjectSpace::AllocationTracer.pause
55
+
56
+ p env["PATH_INFO"]
57
+ case env["PATH_INFO"]
58
+ when /lifetime_table/
59
+ raise "Unsupported: lifetime_table"
60
+ when /allocated_count_table/
61
+ text = allocated_count_table_page
62
+ when /freed_count_table/
63
+ text = freed_count_table_page
64
+ else
65
+ text = allocation_trace_page result
66
+ end
67
+
68
+ if /\As=(\d+)/ =~ env["QUERY_STRING"]
69
+ top = $1.to_i
70
+ @sort_order.unshift top if @sort_order.delete top
71
+ end
72
+
73
+ begin
74
+ [200, {"Content-Type" => "text/html"}, [text]]
75
+ ensure
76
+ ObjectSpace::AllocationTracer.resume
77
+ end
78
+ else
79
+ @app.call env
80
+ end
81
+ end
82
+ end
83
+
84
+ class TotalTracer < Tracer
85
+ def initialize *args
86
+ super
87
+ ObjectSpace::AllocationTracer.setup %i(path line class)
88
+ ObjectSpace::AllocationTracer.start
89
+ end
90
+ end
91
+ end
92
+ end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: allocation_tracer
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.4.3
4
+ version: 0.5.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Koichi Sasada
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-03-05 00:00:00.000000000 Z
11
+ date: 2015-04-14 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -86,6 +86,7 @@ files:
86
86
  - lib/allocation_tracer.rb
87
87
  - lib/allocation_tracer/trace.rb
88
88
  - lib/allocation_tracer/version.rb
89
+ - lib/rack/allocation_tracer.rb
89
90
  - spec/allocation_tracer_spec.rb
90
91
  - spec/spec_helper.rb
91
92
  homepage: https://github.com/ko1/allocation_tracer