ruby-prof 1.1.0-x64-mingw32 → 1.4.2-x64-mingw32

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.
Files changed (91) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +48 -1
  3. data/Rakefile +2 -14
  4. data/bin/ruby-prof +100 -152
  5. data/ext/ruby_prof/extconf.rb +8 -28
  6. data/ext/ruby_prof/rp_aggregate_call_tree.c +59 -0
  7. data/ext/ruby_prof/rp_aggregate_call_tree.h +13 -0
  8. data/ext/ruby_prof/rp_allocation.c +67 -59
  9. data/ext/ruby_prof/rp_allocation.h +3 -3
  10. data/ext/ruby_prof/rp_call_tree.c +369 -0
  11. data/ext/ruby_prof/rp_call_tree.h +43 -0
  12. data/ext/ruby_prof/rp_call_trees.c +288 -0
  13. data/ext/ruby_prof/rp_call_trees.h +28 -0
  14. data/ext/ruby_prof/rp_measure_allocations.c +12 -14
  15. data/ext/ruby_prof/rp_measure_process_time.c +12 -14
  16. data/ext/ruby_prof/rp_measure_wall_time.c +17 -15
  17. data/ext/ruby_prof/rp_measurement.c +47 -40
  18. data/ext/ruby_prof/rp_measurement.h +7 -7
  19. data/ext/ruby_prof/rp_method.c +116 -255
  20. data/ext/ruby_prof/rp_method.h +31 -39
  21. data/ext/ruby_prof/rp_profile.c +316 -303
  22. data/ext/ruby_prof/rp_profile.h +1 -3
  23. data/ext/ruby_prof/rp_stack.c +122 -106
  24. data/ext/ruby_prof/rp_stack.h +17 -20
  25. data/ext/ruby_prof/rp_thread.c +136 -111
  26. data/ext/ruby_prof/rp_thread.h +12 -9
  27. data/ext/ruby_prof/ruby_prof.c +27 -23
  28. data/ext/ruby_prof/ruby_prof.h +9 -0
  29. data/ext/ruby_prof/vc/ruby_prof.sln +8 -0
  30. data/ext/ruby_prof/vc/ruby_prof.vcxproj +22 -7
  31. data/lib/2.7/ruby_prof.so +0 -0
  32. data/lib/ruby-prof.rb +5 -5
  33. data/lib/ruby-prof/assets/call_stack_printer.html.erb +4 -7
  34. data/lib/ruby-prof/assets/graph_printer.html.erb +5 -6
  35. data/lib/ruby-prof/{call_info.rb → call_tree.rb} +6 -6
  36. data/lib/ruby-prof/call_tree_visitor.rb +36 -0
  37. data/lib/ruby-prof/compatibility.rb +0 -10
  38. data/lib/ruby-prof/measurement.rb +5 -2
  39. data/lib/ruby-prof/method_info.rb +3 -15
  40. data/lib/ruby-prof/printers/abstract_printer.rb +12 -2
  41. data/lib/ruby-prof/printers/call_info_printer.rb +12 -10
  42. data/lib/ruby-prof/printers/call_stack_printer.rb +20 -22
  43. data/lib/ruby-prof/printers/call_tree_printer.rb +1 -1
  44. data/lib/ruby-prof/printers/dot_printer.rb +3 -3
  45. data/lib/ruby-prof/printers/flat_printer.rb +3 -2
  46. data/lib/ruby-prof/printers/graph_printer.rb +4 -5
  47. data/lib/ruby-prof/printers/multi_printer.rb +2 -2
  48. data/lib/ruby-prof/profile.rb +8 -4
  49. data/lib/ruby-prof/rack.rb +51 -127
  50. data/lib/ruby-prof/thread.rb +3 -18
  51. data/lib/ruby-prof/version.rb +1 -1
  52. data/ruby-prof.gemspec +7 -0
  53. data/test/alias_test.rb +42 -45
  54. data/test/basic_test.rb +0 -86
  55. data/test/{call_info_visitor_test.rb → call_tree_visitor_test.rb} +6 -5
  56. data/test/call_trees_test.rb +66 -0
  57. data/test/exclude_methods_test.rb +17 -12
  58. data/test/fiber_test.rb +95 -39
  59. data/test/gc_test.rb +36 -42
  60. data/test/inverse_call_tree_test.rb +175 -0
  61. data/test/line_number_test.rb +67 -70
  62. data/test/marshal_test.rb +7 -13
  63. data/test/measure_allocations_test.rb +224 -234
  64. data/test/measure_allocations_trace_test.rb +224 -234
  65. data/test/measure_memory_trace_test.rb +814 -469
  66. data/test/measure_process_time_test.rb +0 -64
  67. data/test/measure_times.rb +2 -0
  68. data/test/measure_wall_time_test.rb +34 -58
  69. data/test/pause_resume_test.rb +19 -10
  70. data/test/prime.rb +1 -3
  71. data/test/prime_script.rb +6 -0
  72. data/test/printer_call_stack_test.rb +0 -1
  73. data/test/printer_call_tree_test.rb +0 -1
  74. data/test/printer_flat_test.rb +61 -30
  75. data/test/printer_graph_html_test.rb +0 -1
  76. data/test/printer_graph_test.rb +3 -4
  77. data/test/printers_test.rb +2 -2
  78. data/test/printing_recursive_graph_test.rb +1 -1
  79. data/test/profile_test.rb +16 -0
  80. data/test/rack_test.rb +0 -64
  81. data/test/recursive_test.rb +50 -54
  82. data/test/start_stop_test.rb +19 -19
  83. data/test/test_helper.rb +6 -17
  84. data/test/thread_test.rb +11 -11
  85. data/test/unique_call_path_test.rb +25 -95
  86. metadata +22 -11
  87. data/ext/ruby_prof/rp_call_info.c +0 -271
  88. data/ext/ruby_prof/rp_call_info.h +0 -35
  89. data/lib/2.6.5/ruby_prof.so +0 -0
  90. data/lib/ruby-prof/call_info_visitor.rb +0 -38
  91. data/test/parser_timings.rb +0 -24
@@ -17,11 +17,21 @@ module RubyProf
17
17
  @output = nil
18
18
  end
19
19
 
20
- # Returns the min_percent of total time a method must take to be included in a profiling report
20
+ # Returns the min_percent of time a method must take to be included in a profiling report
21
21
  def min_percent
22
22
  @options[:min_percent] || 0
23
23
  end
24
24
 
25
+ # Returns the max_percent of time a method can take to be included in a profiling report
26
+ def max_percent
27
+ @options[:max_percent] || 100
28
+ end
29
+
30
+ # Returns the method to filter methods by (when using min_percent and max_percent)
31
+ def filter_by
32
+ @options[:filter_by] || :self_time
33
+ end
34
+
25
35
  # Returns the time format used to show when a profile was run
26
36
  def time_format
27
37
  '%A, %B %-d at %l:%M:%S %p (%Z)'
@@ -89,7 +99,7 @@ module RubyProf
89
99
  end
90
100
 
91
101
  def print_header(thread)
92
- @output << "Measure Mode: %s\n" % RubyProf.measure_mode_string
102
+ @output << "Measure Mode: %s\n" % @result.measure_mode_string
93
103
  @output << "Thread ID: %d\n" % thread.id
94
104
  @output << "Fiber ID: %d\n" % thread.fiber_id unless thread.id == thread.fiber_id
95
105
  @output << "Total: %0.6f\n" % thread.total_time
@@ -1,7 +1,7 @@
1
1
  # encoding: utf-8
2
2
 
3
3
  module RubyProf
4
- # Prints out the call graph based on CallInfo instances. This
4
+ # Prints out the call graph based on CallTree instances. This
5
5
  # is mainly for debugging purposes as it provides access into
6
6
  # into RubyProf's internals.
7
7
  #
@@ -19,6 +19,7 @@ module RubyProf
19
19
  private
20
20
 
21
21
  def print_header(thread)
22
+ @output << "----------------------------------------------------\n"
22
23
  @output << "Thread ID: #{thread.id}\n"
23
24
  @output << "Fiber ID: #{thread.fiber_id}\n"
24
25
  @output << "Total Time: #{thread.total_time}\n"
@@ -27,18 +28,18 @@ module RubyProf
27
28
  end
28
29
 
29
30
  def print_methods(thread)
30
- visitor = CallInfoVisitor.new(thread.root_methods)
31
+ visitor = CallTreeVisitor.new(thread.call_tree)
31
32
 
32
- visitor.visit do |call_info, event|
33
+ visitor.visit do |call_tree, event|
33
34
  if event == :enter
34
- @output << " " * call_info.depth
35
- @output << call_info.target.full_name
35
+ @output << " " * call_tree.depth
36
+ @output << call_tree.target.full_name
36
37
  @output << " ("
37
- @output << "tt:#{sprintf("%#{TIME_WIDTH}.2f", call_info.total_time)}, "
38
- @output << "st:#{sprintf("%#{TIME_WIDTH}.2f", call_info.self_time)}, "
39
- @output << "wt:#{sprintf("%#{TIME_WIDTH}.2f", call_info.wait_time)}, "
40
- @output << "ct:#{sprintf("%#{TIME_WIDTH}.2f", call_info.children_time)}, "
41
- @output << "call:#{call_info.called}, "
38
+ @output << "tt:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.total_time)}, "
39
+ @output << "st:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.self_time)}, "
40
+ @output << "wt:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.wait_time)}, "
41
+ @output << "ct:#{sprintf("%#{TIME_WIDTH}.2f", call_tree.children_time)}, "
42
+ @output << "call:#{call_tree.called}, "
42
43
  @output << ")"
43
44
  @output << "\n"
44
45
  end
@@ -46,6 +47,7 @@ module RubyProf
46
47
  end
47
48
 
48
49
  def print_footer(thread)
50
+ @output << "\n" << "\n"
49
51
  end
50
52
  end
51
53
  end
@@ -4,6 +4,7 @@ require 'erb'
4
4
  require 'fileutils'
5
5
  require 'base64'
6
6
  require 'set'
7
+ require 'stringio'
7
8
 
8
9
  module RubyProf
9
10
  # Prints a HTML visualization of the call tree.
@@ -46,7 +47,6 @@ module RubyProf
46
47
  def print(output = STDOUT, options = {})
47
48
  setup_options(options)
48
49
  output << @erb.result(binding)
49
- a = 1
50
50
  end
51
51
 
52
52
  # :enddoc:
@@ -55,50 +55,49 @@ module RubyProf
55
55
  @erb = ERB.new(self.template)
56
56
  end
57
57
 
58
- def print_stack(output, visited, call_info, parent_time)
59
- total_time = call_info.total_time
58
+ def print_stack(output, visited, call_tree, parent_time)
59
+ total_time = call_tree.total_time
60
60
  percent_parent = (total_time/parent_time)*100
61
61
  percent_total = (total_time/@overall_time)*100
62
62
  return unless percent_total > min_percent
63
63
  color = self.color(percent_total)
64
- kids = call_info.target.callees
65
64
  visible = percent_total >= threshold
66
65
  expanded = percent_total >= expansion
67
66
  display = visible ? "block" : "none"
68
67
 
69
68
  output << "<li class=\"color#{color}\" style=\"display:#{display}\">" << "\n"
70
69
 
71
- if visited.include?(call_info)
70
+ if visited.include?(call_tree)
72
71
  output << "<a href=\"#\" class=\"toggle empty\" ></a>" << "\n"
73
- output << "<span>%s %s</span>" % [link(call_info.target, true), graph_link(call_info)] << "\n"
72
+ output << "<span>%s %s</span>" % [link(call_tree.target, true), graph_link(call_tree)] << "\n"
74
73
  else
75
- visited << call_info
74
+ visited << call_tree
76
75
 
77
- if kids.empty?
76
+ if call_tree.children.empty?
78
77
  output << "<a href=\"#\" class=\"toggle empty\" ></a>" << "\n"
79
78
  else
80
- visible_children = kids.any?{|ci| (ci.total_time/@overall_time)*100 >= threshold}
79
+ visible_children = call_tree.children.any?{|ci| (ci.total_time/@overall_time)*100 >= threshold}
81
80
  image = visible_children ? (expanded ? "minus" : "plus") : "empty"
82
81
  output << "<a href=\"#\" class=\"toggle #{image}\" ></a>" << "\n"
83
82
  end
84
83
  output << "<span>%4.2f%% (%4.2f%%) %s %s</span>" % [percent_total, percent_parent,
85
- link(call_info.target, false), graph_link(call_info)] << "\n"
84
+ link(call_tree.target, false), graph_link(call_tree)] << "\n"
86
85
 
87
- unless kids.empty?
86
+ unless call_tree.children.empty?
88
87
  output << (expanded ? '<ul>' : '<ul style="display:none">') << "\n"
89
- kids.sort_by{|c| -c.total_time}.each do |child_call_info|
90
- print_stack(output, visited, child_call_info, total_time)
88
+ call_tree.children.sort_by{|c| -c.total_time}.each do |child_call_tree|
89
+ print_stack(output, visited, child_call_tree, total_time)
91
90
  end
92
91
  output << '</ul>' << "\n"
93
92
  end
94
93
 
95
- visited.delete(call_info)
94
+ visited.delete(call_tree)
96
95
  end
97
96
  output << '</li>' << "\n"
98
97
  end
99
98
 
100
- def name(call_info)
101
- method = call_info.target
99
+ def name(call_tree)
100
+ method = call_tree.target
102
101
  method.full_name
103
102
  end
104
103
 
@@ -112,19 +111,18 @@ module RubyProf
112
111
  end
113
112
  end
114
113
 
115
- def graph_link(call_info)
116
- total_calls = call_info.target.called
117
- href = "#{method_href(call_info.target)}"
114
+ def graph_link(call_tree)
115
+ total_calls = call_tree.target.called
118
116
  totals = total_calls.to_s
119
- "[#{call_info.called} calls, #{totals} total]"
117
+ "[#{call_tree.called} calls, #{totals} total]"
120
118
  end
121
119
 
122
120
  def method_href(method)
123
121
  h(method.full_name.gsub(/[><#\.\?=:]/,"_"))
124
122
  end
125
123
 
126
- def total_time(call_infos)
127
- sum(call_infos.map{|ci| ci.total_time})
124
+ def total_time(call_trees)
125
+ sum(call_trees.map{|ci| ci.total_time})
128
126
  end
129
127
 
130
128
  def sum(a)
@@ -137,7 +137,7 @@ module RubyProf
137
137
  output << "#{method.line} #{convert(method.self_time)}\n"
138
138
 
139
139
  # Now print out all the children methods
140
- method.callees.each do |callee|
140
+ method.call_trees.callees.each do |callee|
141
141
  output << "cfl=#{file(callee.target)}\n"
142
142
  output << "cfn=#{self.calltree_name(callee.target)}\n"
143
143
  output << "calls=#{callee.called} #{callee.line}\n"
@@ -114,12 +114,12 @@ module RubyProf
114
114
  end
115
115
 
116
116
  def print_edges(total_time, method)
117
- method.callers.sort_by(&:total_time).reverse.each do |call_info|
118
- target_percentage = (call_info.target.total_time / total_time) * 100.0
117
+ method.call_trees.callers.sort_by(&:total_time).reverse.each do |call_tree|
118
+ target_percentage = (call_tree.target.total_time / total_time) * 100.0
119
119
  next if target_percentage < min_percent
120
120
 
121
121
  # Get children method
122
- puts "#{dot_id(method)} -> #{dot_id(call_info.target)} [label=\"#{call_info.called}/#{call_info.target.called}\" fontsize=10 fontcolor=#{EDGE_COLOR}];"
122
+ puts "#{dot_id(method)} -> #{dot_id(call_tree.target)} [label=\"#{call_tree.called}/#{call_tree.target.called}\" fontsize=10 fontcolor=#{EDGE_COLOR}];"
123
123
  end
124
124
  end
125
125
 
@@ -29,8 +29,9 @@ module RubyProf
29
29
 
30
30
  sum = 0
31
31
  methods.each do |method|
32
- self_percent = (method.self_time / total_time) * 100
33
- next if self_percent < min_percent
32
+ percent = (method.send(filter_by) / total_time) * 100
33
+ next if percent < min_percent
34
+ next if percent > max_percent
34
35
 
35
36
  sum += method.self_time
36
37
  #self_time_called = method.called > 0 ? method.self_time/method.called : 0
@@ -25,7 +25,7 @@ module RubyProf
25
25
  end
26
26
 
27
27
  def print_header(thread)
28
- @output << "Measure Mode: %s\n" % RubyProf.measure_mode_string
28
+ @output << "Measure Mode: %s\n" % @result.measure_mode_string
29
29
  @output << "Thread ID: #{thread.id}\n"
30
30
  @output << "Fiber ID: #{thread.fiber_id}\n"
31
31
  @output << "Total Time: #{thread.total_time}\n"
@@ -78,8 +78,7 @@ module RubyProf
78
78
  end
79
79
 
80
80
  def print_parents(thread, method)
81
- return if method.root?
82
- method.callers.sort_by(&:total_time).each do |caller|
81
+ method.call_trees.callers.sort_by(&:total_time).each do |caller|
83
82
  @output << " " * 2 * PERCENTAGE_WIDTH
84
83
  @output << sprintf("%#{TIME_WIDTH}.3f", caller.total_time)
85
84
  @output << sprintf("%#{TIME_WIDTH}.3f", caller.self_time)
@@ -88,13 +87,13 @@ module RubyProf
88
87
 
89
88
  call_called = "#{caller.called}/#{method.called}"
90
89
  @output << sprintf("%#{CALL_WIDTH}s", call_called)
91
- @output << sprintf(" %s", caller.parent.full_name)
90
+ @output << sprintf(" %s", caller.parent.target.full_name)
92
91
  @output << "\n"
93
92
  end
94
93
  end
95
94
 
96
95
  def print_children(method)
97
- method.callees.sort_by(&:total_time).reverse.each do |child|
96
+ method.call_trees.callees.sort_by(&:total_time).reverse.each do |child|
98
97
  # Get children method
99
98
 
100
99
  @output << " " * 2 * PERCENTAGE_WIDTH
@@ -12,7 +12,7 @@ module RubyProf
12
12
  @graph_html_printer = GraphHtmlPrinter.new(result) if printers.include?(:graph_html)
13
13
 
14
14
  @tree_printer = CallTreePrinter.new(result) if printers.include?(:tree)
15
- @call_info_printer = CallInfoPrinter.new(result) if printers.include?(:call_info)
15
+ @call_info_printer = CallInfoPrinter.new(result) if printers.include?(:call_tree)
16
16
 
17
17
  @stack_printer = CallStackPrinter.new(result) if printers.include?(:stack)
18
18
  @dot_printer = DotPrinter.new(result) if printers.include?(:dot)
@@ -58,7 +58,7 @@ module RubyProf
58
58
 
59
59
  # the name of the callinfo profile file
60
60
  def call_info_report
61
- "#{@directory}/#{@profile}.call_info.txt"
61
+ "#{@directory}/#{@profile}.call_tree.txt"
62
62
  end
63
63
 
64
64
  # the name of the callgrind profile file
@@ -7,10 +7,14 @@ module RubyProf
7
7
  # :nodoc:
8
8
  def measure_mode_string
9
9
  case self.measure_mode
10
- when WALL_TIME then "wall_time"
11
- when PROCESS_TIME then "process_time"
12
- when ALLOCATIONS then "allocations"
13
- when MEMORY then "memory"
10
+ when WALL_TIME
11
+ "wall_time"
12
+ when PROCESS_TIME
13
+ "process_time"
14
+ when ALLOCATIONS
15
+ "allocations"
16
+ when MEMORY
17
+ "memory"
14
18
  end
15
19
  end
16
20
 
@@ -5,43 +5,37 @@ module Rack
5
5
  class RubyProf
6
6
  def initialize(app, options = {})
7
7
  @app = app
8
+ @options = options
9
+ @options[:min_percent] ||= 1
8
10
 
9
- options[:min_percent] ||= 1
11
+ @tmpdir = options[:path] || Dir.tmpdir
12
+ FileUtils.mkdir_p(@tmpdir)
10
13
 
11
- options[:path] ||= Dir.tmpdir
12
- FileUtils.mkdir_p(options[:path])
14
+ @printer_klasses = @options[:printers] || {::RubyProf::FlatPrinter => 'flat.txt',
15
+ ::RubyProf::GraphPrinter => 'graph.txt',
16
+ ::RubyProf::GraphHtmlPrinter => 'graph.html',
17
+ ::RubyProf::CallStackPrinter => 'call_stack.html'}
13
18
 
14
19
  @skip_paths = options[:skip_paths] || [%r{^/assets}, %r{\.(css|js|png|jpeg|jpg|gif)$}]
15
20
  @only_paths = options[:only_paths]
16
-
17
- @max_requests = options[:max_requests]
18
-
19
- @options = options
20
21
  end
21
22
 
22
23
  def call(env)
23
24
  request = Rack::Request.new(env)
24
25
 
25
26
  if should_profile?(request.path)
26
- profiler.resume
27
27
  begin
28
- result = @app.call(env)
29
- ensure
30
- profiler.pause
31
- end
28
+ result = nil
29
+ data = ::RubyProf::Profile.profile(profiling_options) do
30
+ result = @app.call(env)
31
+ end
32
32
 
33
- if profiler.max_requests_reached?
34
- prefix = if aggregate_requests?
35
- nil
36
- else
37
- request.path.gsub('/', '-')[1..-1]
38
- end
33
+ path = request.path.gsub('/', '-')
34
+ path.slice!(0)
39
35
 
40
- profiler.print!(prefix)
41
- delete_profiler!
36
+ print(data, path)
37
+ result
42
38
  end
43
-
44
- result
45
39
  else
46
40
  @app.call(env)
47
41
  end
@@ -49,123 +43,53 @@ module Rack
49
43
 
50
44
  private
51
45
 
52
- class RackProfiler
53
- def initialize(options)
54
- @options = options
55
-
56
- @profile = ::RubyProf::Profile.new(profiling_options)
57
- @profile.start
58
- @profile.pause
59
-
60
- @printer_klasses = options[:printers] || default_printers
61
-
62
- @tmpdir = options[:path]
63
-
64
- @max_requests = options[:max_requests] || 1
65
- @requests_count = 0
46
+ def should_profile?(path)
47
+ return false if paths_match?(path, @skip_paths)
66
48
 
67
- @printed = false
68
- # if running across multiple requests, we want to make sure that the
69
- # ongoing profile is not lost if the process shuts down before the
70
- # max request count is reached
71
- ObjectSpace.define_finalizer(self, proc { print! })
72
- end
49
+ @only_paths ? paths_match?(path, @only_paths) : true
50
+ end
73
51
 
74
- def resume
75
- @profile.resume
76
- end
52
+ def paths_match?(path, paths)
53
+ paths.any? { |skip_path| skip_path =~ path }
54
+ end
77
55
 
78
- def pause
79
- @profile.pause
80
- @requests_count += 1
56
+ def profiling_options
57
+ options = {}
58
+ options[:measure_mode] = ::RubyProf.measure_mode
59
+ options[:exclude_threads] =
60
+ if @options[:ignore_existing_threads]
61
+ Thread.list.select{|t| t != Thread.current}
62
+ else
63
+ ::RubyProf.exclude_threads
64
+ end
65
+ if @options[:request_thread_only]
66
+ options[:include_threads] = [Thread.current]
81
67
  end
82
-
83
- def max_requests_reached?
84
- @requests_count >= @max_requests
68
+ if @options[:merge_fibers]
69
+ options[:merge_fibers] = true
85
70
  end
71
+ options
72
+ end
86
73
 
87
- def print!(prefix = nil)
88
- return false if @printed || @requests_count == 0
89
-
90
- data = @profile.stop
91
-
92
- prefix ||= "multi-requests-#{@requests_count}"
93
-
94
- @printer_klasses.each do |printer_klass, base_name|
95
- printer = printer_klass.new(data)
96
-
97
- if base_name.respond_to?(:call)
98
- base_name = base_name.call
99
- end
74
+ def print(data, path)
75
+ @printer_klasses.each do |printer_klass, base_name|
76
+ printer = printer_klass.new(data)
100
77
 
101
- if printer_klass == ::RubyProf::MultiPrinter \
102
- || printer_klass == ::RubyProf::CallTreePrinter
103
- printer.print(@options.merge(:profile => "#{prefix}-#{base_name}"))
104
- else
105
- file_name = ::File.join(@tmpdir, "#{prefix}-#{base_name}")
106
- ::File.open(file_name, 'wb') do |file|
107
- printer.print(file, @options)
108
- end
109
- end
78
+ if base_name.respond_to?(:call)
79
+ base_name = base_name.call
110
80
  end
111
81
 
112
- @printed = true
113
- end
114
-
115
- private
116
-
117
- def profiling_options
118
- options = {}
119
- options[:measure_mode] = ::RubyProf.measure_mode
120
- options[:exclude_threads] =
121
- if @options[:ignore_existing_threads]
122
- Thread.list.select{|t| t != Thread.current}
123
- else
124
- ::RubyProf.exclude_threads
82
+ if printer_klass == ::RubyProf::MultiPrinter
83
+ printer.print(@options.merge(:profile => "#{path}-#{base_name}"))
84
+ elsif printer_klass == ::RubyProf::CallTreePrinter
85
+ printer.print(@options.merge(:profile => "#{path}-#{base_name}"))
86
+ else
87
+ file_name = ::File.join(@tmpdir, "#{path}-#{base_name}")
88
+ ::File.open(file_name, 'wb') do |file|
89
+ printer.print(file, @options)
125
90
  end
126
- if @options[:request_thread_only]
127
- options[:include_threads] = [Thread.current]
128
91
  end
129
- options
130
- end
131
-
132
- def default_printers
133
- {::RubyProf::FlatPrinter => 'flat.txt',
134
- ::RubyProf::GraphPrinter => 'graph.txt',
135
- ::RubyProf::GraphHtmlPrinter => 'graph.html',
136
- ::RubyProf::CallStackPrinter => 'call_stack.html'}
137
92
  end
138
93
  end
139
-
140
- def profiler
141
- if aggregate_requests?
142
- @@_shared_profiler ||= RackProfiler.new(@options)
143
- else
144
- @_profiler ||= RackProfiler.new(@options)
145
- end
146
- end
147
-
148
- def delete_profiler!
149
- if aggregate_requests?
150
- @@_shared_profiler.print! if @@_shared_profiler
151
- @@_shared_profiler = nil
152
- else
153
- @_profiler = nil
154
- end
155
- end
156
-
157
- def aggregate_requests?
158
- !@max_requests.nil?
159
- end
160
-
161
- def should_profile?(path)
162
- return false if paths_match?(path, @skip_paths)
163
-
164
- @only_paths ? paths_match?(path, @only_paths) : true
165
- end
166
-
167
- def paths_match?(path, paths)
168
- paths.any? { |skip_path| skip_path =~ path }
169
- end
170
94
  end
171
95
  end