ruby-prof 0.12.2 → 0.13.0

Sign up to get free protection for your applications and to get access to all the features.
Files changed (50) hide show
  1. data/README.rdoc +2 -2
  2. data/doc/LICENSE.html +1 -1
  3. data/doc/README_rdoc.html +2 -2
  4. data/doc/Rack.html +1 -1
  5. data/doc/Rack/RubyProf.html +2 -2
  6. data/doc/RubyProf.html +1 -1
  7. data/doc/RubyProf/AbstractPrinter.html +1 -1
  8. data/doc/RubyProf/AggregateCallInfo.html +1 -1
  9. data/doc/RubyProf/CallInfo.html +1 -1
  10. data/doc/RubyProf/CallInfoPrinter.html +1 -1
  11. data/doc/RubyProf/CallInfoVisitor.html +1 -1
  12. data/doc/RubyProf/CallStackPrinter.html +30 -27
  13. data/doc/RubyProf/CallTreePrinter.html +1 -1
  14. data/doc/RubyProf/Cmd.html +1 -1
  15. data/doc/RubyProf/DotPrinter.html +1 -1
  16. data/doc/RubyProf/FlatPrinter.html +1 -1
  17. data/doc/RubyProf/FlatPrinterWithLineNumbers.html +1 -1
  18. data/doc/RubyProf/GraphHtmlPrinter.html +14 -5
  19. data/doc/RubyProf/GraphPrinter.html +1 -1
  20. data/doc/RubyProf/MethodInfo.html +1 -1
  21. data/doc/RubyProf/MultiPrinter.html +1 -1
  22. data/doc/RubyProf/Profile.html +1 -1
  23. data/doc/RubyProf/ProfileTask.html +1 -1
  24. data/doc/RubyProf/Test.html +1 -1
  25. data/doc/RubyProf/Thread.html +1 -1
  26. data/doc/created.rid +11 -10
  27. data/doc/examples/flat_txt.html +1 -1
  28. data/doc/examples/graph_txt.html +1 -1
  29. data/doc/index.html +2 -2
  30. data/doc/js/darkfish.js +9 -7
  31. data/doc/table_of_contents.html +1 -1
  32. data/ext/ruby_prof/extconf.rb +2 -0
  33. data/ext/ruby_prof/rp_thread.c +24 -8
  34. data/ext/ruby_prof/rp_thread.h +5 -4
  35. data/ext/ruby_prof/ruby_prof.c +26 -10
  36. data/ext/ruby_prof/version.h +3 -3
  37. data/lib/ruby-prof/printers/call_info_printer.rb +2 -1
  38. data/lib/ruby-prof/printers/call_stack_printer.rb +7 -4
  39. data/lib/ruby-prof/printers/flat_printer.rb +1 -0
  40. data/lib/ruby-prof/printers/graph_html_printer.rb +13 -4
  41. data/lib/ruby-prof/printers/graph_printer.rb +2 -1
  42. data/lib/ruby-prof/rack.rb +1 -1
  43. data/ruby-prof.gemspec +1 -1
  44. data/test/fiber_test.rb +65 -0
  45. data/test/measure_process_time_test.rb +2 -2
  46. data/test/multi_printer_test.rb +4 -2
  47. data/test/printers_test.rb +2 -0
  48. data/test/stack_printer_test.rb +2 -2
  49. data/test/test_helper.rb +2 -0
  50. metadata +32 -25
@@ -203,7 +203,7 @@ href="../README_rdoc.html">README</a></p>
203
203
 
204
204
  <footer id="validator-badges">
205
205
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
206
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
206
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
207
207
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
208
208
  </footer>
209
209
 
@@ -707,7 +707,7 @@
707
707
 
708
708
  <footer id="validator-badges">
709
709
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
710
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
710
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
711
711
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
712
712
  </footer>
713
713
 
@@ -401,7 +401,7 @@ base name for the pofile file, defaults to “profile”.</p>
401
401
 
402
402
  <footer id="validator-badges">
403
403
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
404
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
404
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
405
405
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
406
406
  </footer>
407
407
 
@@ -815,7 +815,7 @@ prof_threads(VALUE self)
815
815
 
816
816
  <footer id="validator-badges">
817
817
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
818
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
818
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
819
819
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
820
820
  </footer>
821
821
 
@@ -526,7 +526,7 @@ rake profile TESTOPTS=&quot;--runner=fox&quot; # use the fox test runner</pre>
526
526
 
527
527
  <footer id="validator-badges">
528
528
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
529
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
529
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
530
530
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
531
531
  </footer>
532
532
 
@@ -572,7 +572,7 @@
572
572
 
573
573
  <footer id="validator-badges">
574
574
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
575
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
575
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
576
576
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
577
577
  </footer>
578
578
 
@@ -256,7 +256,7 @@
256
256
 
257
257
  <footer id="validator-badges">
258
258
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
259
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
259
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
260
260
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
261
261
  </footer>
262
262
 
data/doc/created.rid CHANGED
@@ -1,5 +1,6 @@
1
- Wed, 13 Feb 2013 12:28:24 +0100
1
+ Sun, 10 Mar 2013 11:08:41 +0100
2
2
  bin/ruby-prof Sat, 02 Feb 2013 10:23:19 +0100
3
+ bin/ruby-prof-check-trace Sun, 10 Mar 2013 10:57:14 +0100
3
4
  examples/flat.txt Tue, 29 Jan 2013 16:43:39 +0100
4
5
  examples/graph.txt Tue, 29 Jan 2013 16:43:39 +0100
5
6
  examples/graph.html Tue, 29 Jan 2013 16:43:39 +0100
@@ -10,22 +11,22 @@ lib/ruby-prof/call_info_visitor.rb Tue, 29 Jan 2013 16:44:27 +0100
10
11
  lib/ruby-prof/compatibility.rb Sun, 03 Feb 2013 12:16:49 +0100
11
12
  lib/ruby-prof/method_info.rb Tue, 29 Jan 2013 16:44:27 +0100
12
13
  lib/ruby-prof/printers/abstract_printer.rb Tue, 29 Jan 2013 16:43:39 +0100
13
- lib/ruby-prof/printers/call_info_printer.rb Tue, 29 Jan 2013 16:44:27 +0100
14
- lib/ruby-prof/printers/call_stack_printer.rb Tue, 29 Jan 2013 16:44:27 +0100
14
+ lib/ruby-prof/printers/call_info_printer.rb Sun, 10 Mar 2013 10:57:14 +0100
15
+ lib/ruby-prof/printers/call_stack_printer.rb Sun, 10 Mar 2013 10:57:14 +0100
15
16
  lib/ruby-prof/printers/call_tree_printer.rb Tue, 29 Jan 2013 16:43:39 +0100
16
17
  lib/ruby-prof/printers/dot_printer.rb Tue, 29 Jan 2013 16:44:27 +0100
17
- lib/ruby-prof/printers/flat_printer.rb Tue, 29 Jan 2013 16:44:27 +0100
18
+ lib/ruby-prof/printers/flat_printer.rb Sun, 10 Mar 2013 10:57:14 +0100
18
19
  lib/ruby-prof/printers/flat_printer_with_line_numbers.rb Tue, 29 Jan 2013 16:44:27 +0100
19
- lib/ruby-prof/printers/graph_html_printer.rb Tue, 29 Jan 2013 16:44:27 +0100
20
- lib/ruby-prof/printers/graph_printer.rb Tue, 29 Jan 2013 16:44:27 +0100
20
+ lib/ruby-prof/printers/graph_html_printer.rb Sun, 10 Mar 2013 10:57:14 +0100
21
+ lib/ruby-prof/printers/graph_printer.rb Sun, 10 Mar 2013 10:57:14 +0100
21
22
  lib/ruby-prof/printers/multi_printer.rb Tue, 29 Jan 2013 16:43:39 +0100
22
23
  lib/ruby-prof/profile.rb Tue, 29 Jan 2013 16:44:27 +0100
23
- lib/ruby-prof/rack.rb Tue, 29 Jan 2013 16:44:27 +0100
24
+ lib/ruby-prof/rack.rb Sun, 10 Mar 2013 10:56:55 +0100
24
25
  lib/ruby-prof/task.rb Tue, 29 Jan 2013 16:43:39 +0100
25
26
  lib/ruby-prof/test.rb Tue, 29 Jan 2013 16:43:39 +0100
26
27
  lib/ruby-prof/thread.rb Tue, 29 Jan 2013 16:44:27 +0100
27
28
  lib/unprof.rb Tue, 29 Jan 2013 16:43:39 +0100
28
- ext/ruby_prof/ruby_prof.c Sun, 03 Feb 2013 12:16:38 +0100
29
- ext/ruby_prof/version.h Wed, 13 Feb 2013 10:39:51 +0100
30
- README.rdoc Tue, 29 Jan 2013 16:44:27 +0100
29
+ ext/ruby_prof/ruby_prof.c Sun, 10 Mar 2013 10:57:14 +0100
30
+ ext/ruby_prof/version.h Sun, 10 Mar 2013 11:07:12 +0100
31
+ README.rdoc Sun, 10 Mar 2013 10:56:55 +0100
31
32
  LICENSE Tue, 29 Jan 2013 16:43:39 +0100
@@ -185,7 +185,7 @@ total time of 8.72 seconds.</p>
185
185
 
186
186
  <footer id="validator-badges">
187
187
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
188
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
188
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
189
189
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
190
190
  </footer>
191
191
 
@@ -299,7 +299,7 @@ in the graph table.</p>
299
299
 
300
300
  <footer id="validator-badges">
301
301
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
302
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
302
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
303
303
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
304
304
  </footer>
305
305
 
data/doc/index.html CHANGED
@@ -445,7 +445,7 @@ other printers to create several reports in one profiling run</p>
445
445
  <p>To use a printer:</p>
446
446
 
447
447
  <pre class="ruby"><span class="ruby-operator">...</span>
448
- <span class="ruby-identifier">result</span> = <span class="ruby-constant">RubyProf</span>.<span class="ruby-identifier">end</span>
448
+ <span class="ruby-identifier">result</span> = <span class="ruby-constant">RubyProf</span>.<span class="ruby-identifier">stop</span>
449
449
  <span class="ruby-identifier">printer</span> = <span class="ruby-constant">RubyProf</span><span class="ruby-operator">::</span><span class="ruby-constant">GraphPrinter</span>.<span class="ruby-identifier">new</span>(<span class="ruby-identifier">result</span>)
450
450
  <span class="ruby-identifier">printer</span>.<span class="ruby-identifier">print</span>(<span class="ruby-constant">STDOUT</span>, :<span class="ruby-identifier">min_percent</span> =<span class="ruby-operator">&gt;</span> <span class="ruby-value">2</span>)
451
451
  </pre>
@@ -633,7 +633,7 @@ href="http://groups.google.com/group/ruby-optimization">groups.google.com/group/
633
633
 
634
634
  <footer id="validator-badges">
635
635
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
636
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
636
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
637
637
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
638
638
  </footer>
639
639
 
data/doc/js/darkfish.js CHANGED
@@ -109,13 +109,15 @@ function hookSearch() {
109
109
  function highlightTarget( anchor ) {
110
110
  console.debug( "Highlighting target '%s'.", anchor );
111
111
 
112
- $("a[name=" + anchor + "]").each( function() {
113
- if ( !$(this).parent().parent().hasClass('target-section') ) {
114
- console.debug( "Wrapping the target-section" );
115
- $('div.method-detail').unwrap( 'div.target-section' );
116
- $(this).parent().wrap( '<div class="target-section"></div>' );
117
- } else {
118
- console.debug( "Already wrapped." );
112
+ $("a[name]").each( function() {
113
+ if ( $(this).attr("name") == anchor ) {
114
+ if ( !$(this).parent().parent().hasClass('target-section') ) {
115
+ console.debug( "Wrapping the target-section" );
116
+ $('div.method-detail').unwrap( 'div.target-section' );
117
+ $(this).parent().wrap( '<div class="target-section"></div>' );
118
+ } else {
119
+ console.debug( "Already wrapped." );
120
+ }
119
121
  }
120
122
  });
121
123
  };
@@ -456,7 +456,7 @@
456
456
 
457
457
  <footer id="validator-badges">
458
458
  <p><a href="http://validator.w3.org/check/referer">[Validate]</a>
459
- <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.
459
+ <p>Generated by <a href="https://github.com/rdoc/rdoc">RDoc</a> 3.12.1.
460
460
  <p>Generated with the <a href="http://deveiate.org/projects/Darkfish-Rdoc/">Darkfish Rdoc Generator</a> 3.
461
461
  </footer>
462
462
 
@@ -25,6 +25,8 @@ have_func("rb_class_superclass")
25
25
  have_func("rb_heap_total_mem")
26
26
  have_func("rb_gc_heap_info")
27
27
 
28
+ # whether our ruby has fibers
29
+ have_func("rb_fiber_current")
28
30
 
29
31
  def add_define(name, value = nil)
30
32
  if value
@@ -65,10 +65,13 @@ prof_thread_mark(thread_data_t *thread)
65
65
 
66
66
  if (thread->methods != Qnil)
67
67
  rb_gc_mark(thread->methods);
68
-
68
+
69
69
  if (thread->thread_id != Qnil)
70
70
  rb_gc_mark(thread->thread_id);
71
71
 
72
+ if (thread->fiber_id != Qnil)
73
+ rb_gc_mark(thread->fiber_id);
74
+
72
75
  st_foreach(thread->method_table, mark_methods, 0);
73
76
  }
74
77
 
@@ -119,20 +122,20 @@ threads_table_free(st_table *table)
119
122
  }
120
123
 
121
124
  size_t
122
- threads_table_insert(prof_profile_t* profile, VALUE thread, thread_data_t *thread_data)
125
+ threads_table_insert(prof_profile_t* profile, VALUE fiber, thread_data_t *thread_data)
123
126
  {
124
127
  /* Its too slow to key on the real thread id so just typecast thread instead. */
125
- return st_insert(profile->threads_tbl, (st_data_t) thread, (st_data_t) thread_data);
128
+ return st_insert(profile->threads_tbl, (st_data_t) fiber, (st_data_t) thread_data);
126
129
  }
127
130
 
128
131
  thread_data_t *
129
- threads_table_lookup(prof_profile_t* profile, VALUE thread_id)
132
+ threads_table_lookup(prof_profile_t* profile, VALUE thread_id, VALUE fiber_id)
130
133
  {
131
134
  thread_data_t* result;
132
135
  st_data_t val;
133
136
 
134
137
  /* Its too slow to key on the real thread id so just typecast thread instead. */
135
- if (st_lookup(profile->threads_tbl, (st_data_t) thread_id, &val))
138
+ if (st_lookup(profile->threads_tbl, (st_data_t) fiber_id, &val))
136
139
  {
137
140
  result = (thread_data_t *) val;
138
141
  }
@@ -140,21 +143,22 @@ threads_table_lookup(prof_profile_t* profile, VALUE thread_id)
140
143
  {
141
144
  result = thread_data_create();
142
145
  result->thread_id = thread_id;
146
+ result->fiber_id = fiber_id;
143
147
 
144
148
  /* Insert the table */
145
- threads_table_insert(profile, thread_id, result);
149
+ threads_table_insert(profile, fiber_id, result);
146
150
  }
147
151
  return result;
148
152
  }
149
153
 
150
154
  thread_data_t *
151
- switch_thread(void* prof, VALUE thread_id)
155
+ switch_thread(void* prof, VALUE thread_id, VALUE fiber_id)
152
156
  {
153
157
  prof_profile_t* profile = (prof_profile_t*)prof;
154
158
  double measurement = profile->measurer->measure();
155
159
 
156
160
  /* Get new thread information. */
157
- thread_data_t *thread_data = threads_table_lookup(profile, thread_id);
161
+ thread_data_t *thread_data = threads_table_lookup(profile, thread_id, fiber_id);
158
162
 
159
163
  /* Get current frame for this thread */
160
164
  prof_frame_t *frame = prof_stack_peek(thread_data->stack);
@@ -225,6 +229,17 @@ prof_thread_id(VALUE self)
225
229
  return thread->thread_id;
226
230
  }
227
231
 
232
+ /* call-seq:
233
+ fiber_id -> number
234
+
235
+ Returns the fiber id of this thread. */
236
+ static VALUE
237
+ prof_fiber_id(VALUE self)
238
+ {
239
+ thread_data_t* thread = prof_get_thread(self);
240
+ return thread->fiber_id;
241
+ }
242
+
228
243
  /* call-seq:
229
244
  methods -> Array of MethodInfo
230
245
 
@@ -248,5 +263,6 @@ void rp_init_thread()
248
263
  rb_undef_method(CLASS_OF(cRpThread), "new");
249
264
 
250
265
  rb_define_method(cRpThread, "id", prof_thread_id, 0);
266
+ rb_define_method(cRpThread, "fiber_id", prof_fiber_id, 0);
251
267
  rb_define_method(cRpThread, "methods", prof_thread_methods, 0);
252
268
  }
@@ -5,18 +5,19 @@
5
5
  #define __RP_THREAD__
6
6
 
7
7
  /* Profiling information for a thread. */
8
- typedef struct
8
+ typedef struct
9
9
  {
10
- VALUE object; /* Cache to wrapped object */
11
- VALUE methods; /* Array of RubyProf::MethodInfo */
10
+ VALUE object; /* Cache to wrapped object */
11
+ VALUE methods; /* Array of RubyProf::MethodInfo */
12
12
  VALUE thread_id; /* Thread id */
13
+ VALUE fiber_id; /* Fiber id */
13
14
  st_table* method_table; /* Methods called in the thread */
14
15
  prof_stack_t* stack; /* Stack of frames */
15
16
  } thread_data_t;
16
17
 
17
18
  void rp_init_thread();
18
19
  st_table * threads_table_create();
19
- thread_data_t* switch_thread(void* prof, VALUE thread_id);
20
+ thread_data_t* switch_thread(void* prof, VALUE thread_id, VALUE fiber_id);
20
21
  void threads_table_free(st_table *table);
21
22
  VALUE prof_thread_wrap(thread_data_t *thread);
22
23
  void prof_thread_mark(thread_data_t *thread);
@@ -123,13 +123,13 @@ static prof_method_t*
123
123
  static int
124
124
  pop_frames(st_data_t key, st_data_t value, st_data_t data)
125
125
  {
126
- VALUE thread_id = (VALUE)key;
126
+ VALUE fiber_id = (VALUE)key;
127
127
  thread_data_t* thread_data = (thread_data_t *) value;
128
128
  prof_profile_t* profile = (prof_profile_t*) data;
129
129
  double measurement = profile->measurer->measure();
130
130
 
131
- if (!profile->last_thread_data || profile->last_thread_data->thread_id != thread_id)
132
- thread_data = switch_thread(profile, thread_id);
131
+ if (!profile->last_thread_data || profile->last_thread_data->fiber_id != fiber_id)
132
+ thread_data = switch_thread(profile, Qnil, fiber_id);
133
133
  else
134
134
  thread_data = profile->last_thread_data;
135
135
 
@@ -155,10 +155,16 @@ static void
155
155
  prof_trace(prof_profile_t* profile, rb_event_flag_t event, NODE *node, ID mid, VALUE klass, double measurement)
156
156
  #endif
157
157
  {
158
- static VALUE last_thread_id = Qnil;
158
+ static VALUE last_fiber_id = Qnil;
159
159
 
160
160
  VALUE thread = rb_thread_current();
161
161
  VALUE thread_id = rb_obj_id(thread);
162
+ #if defined(HAVE_RB_FIBER_CURRENT)
163
+ VALUE fiber = rb_fiber_current();
164
+ VALUE fiber_id = rb_obj_id(fiber);
165
+ #else
166
+ VALUE fiber_id = thread_id;
167
+ #endif
162
168
  const char* class_name = NULL;
163
169
  const char* method_name = rb_id2name(mid);
164
170
  const char* source_file = rb_sourcefile();
@@ -171,15 +177,16 @@ prof_trace(prof_profile_t* profile, rb_event_flag_t event, NODE *node, ID mid, V
171
177
 
172
178
  class_name = rb_class2name(klass);
173
179
 
174
- if (last_thread_id != thread_id)
180
+ if (last_fiber_id != fiber_id)
175
181
  {
176
182
  fprintf(trace_file, "\n");
177
183
  }
178
184
 
179
- fprintf(trace_file, "%2u:%2ums %-8s %s:%2d %s#%s\n",
180
- (unsigned int) thread_id, (unsigned int) measurement, event_name, source_file, source_line, class_name, method_name);
185
+ fprintf(trace_file, "%2lu:%2lu:%2ums %-8s %s:%2d %s#%s\n",
186
+ (unsigned long) thread_id, (unsigned long) fiber_id, (unsigned int) measurement*1000,
187
+ event_name, source_file, source_line, class_name, method_name);
181
188
  fflush(trace_file);
182
- last_thread_id = thread_id;
189
+ last_fiber_id = fiber_id;
183
190
  }
184
191
 
185
192
  #ifdef RUBY_VM
@@ -198,6 +205,8 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
198
205
 
199
206
  VALUE thread = Qnil;
200
207
  VALUE thread_id = Qnil;
208
+ VALUE fiber = Qnil;
209
+ VALUE fiber_id = Qnil;
201
210
  thread_data_t* thread_data = NULL;
202
211
  prof_frame_t *frame = NULL;
203
212
  double measurement;
@@ -230,6 +239,13 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
230
239
  /* Get the current thread information. */
231
240
  thread = rb_thread_current();
232
241
  thread_id = rb_obj_id(thread);
242
+ #if defined(HAVE_RB_FIBER_CURRENT)
243
+ fiber = rb_fiber_current();
244
+ fiber_id = rb_obj_id(fiber);
245
+ #else
246
+ fiber = thread;
247
+ fiber_id = thread_id;
248
+ #endif
233
249
 
234
250
  if (st_lookup(profile->exclude_threads_tbl, (st_data_t) thread_id, 0))
235
251
  {
@@ -237,8 +253,8 @@ prof_event_hook(rb_event_flag_t event, NODE *node, VALUE self, ID mid, VALUE kla
237
253
  }
238
254
 
239
255
  /* Was there a context switch? */
240
- if (!profile->last_thread_data || profile->last_thread_data->thread_id != thread_id)
241
- thread_data = switch_thread(profile, thread_id);
256
+ if (!profile->last_thread_data || profile->last_thread_data->fiber_id != fiber_id)
257
+ thread_data = switch_thread(profile, thread_id, fiber_id);
242
258
  else
243
259
  thread_data = profile->last_thread_data;
244
260
 
@@ -1,7 +1,7 @@
1
1
  /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
2
  Please see the LICENSE file for copyright and distribution information */
3
3
 
4
- #define RUBY_PROF_VERSION "0.12.2" // as a string, for easy parsing from rake files
4
+ #define RUBY_PROF_VERSION "0.13.0" // as a string, for easy parsing from rake files
5
5
  #define RUBY_PROF_VERSION_MAJ 0
6
- #define RUBY_PROF_VERSION_MIN 12
7
- #define RUBY_PROF_VERSION_MIC 2
6
+ #define RUBY_PROF_VERSION_MIN 13
7
+ #define RUBY_PROF_VERSION_MIC 0
@@ -12,6 +12,7 @@ module RubyProf
12
12
 
13
13
  def print_header(thread)
14
14
  @output << "Thread ID: #{thread.id}\n"
15
+ @output << "Fiber ID: #{thread.fiber_id}\n"
15
16
  @output << "Total Time: #{thread.total_time}\n"
16
17
  @output << "Sort by: #{sort_method}\n"
17
18
  @output << "\n"
@@ -37,4 +38,4 @@ module RubyProf
37
38
  end
38
39
  end
39
40
  end
40
- end
41
+ end
@@ -49,9 +49,12 @@ module RubyProf
49
49
  end
50
50
 
51
51
  @result.threads.each do |thread|
52
- @current_thread_id = thread.id
52
+ @current_thread_id = thread.fiber_id
53
53
  @overall_time = thread.total_time
54
- @output.print "<div class=\"thread\">Thread: #{thread.id} (#{"%4.2f%%" % ((@overall_time/@overall_threads_time)*100)} ~ #{@overall_time})</div>"
54
+ thread_info = "Thread: #{thread.id}"
55
+ thread_info << ", Fiber: #{thread.fiber_id}" unless thread.id == thread.fiber_id
56
+ thread_info << " (#{"%4.2f%%" % ((@overall_time/@overall_threads_time)*100)} ~ #{@overall_time})"
57
+ @output.print "<div class=\"thread\">#{thread_info}</div>"
55
58
  @output.print "<ul name=\"thread\">"
56
59
  thread.methods.each do |m|
57
60
  # $stderr.print m.dump
@@ -195,14 +198,14 @@ module RubyProf
195
198
  @output.puts "<title>#{h title}</title>"
196
199
  print_css
197
200
  print_java_script
198
- @output.puts '</head><body>'
201
+ @output.puts '</head><body><div style="display: inline-block;">'
199
202
  print_title_bar
200
203
  print_commands
201
204
  print_help
202
205
  end
203
206
 
204
207
  def print_footer
205
- @output.puts '<div id="sentinel"></div></body></html>'
208
+ @output.puts '<div id="sentinel"></div></div></body></html>'
206
209
  end
207
210
 
208
211
  def print_css