allocation_tracer 0.4.3 → 0.5.0

Sign up to get free protection for your applications and to get access to all the features.
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