ruby-prof 1.7.1 → 2.0.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.
Files changed (134) hide show
  1. checksums.yaml +4 -4
  2. data/{CHANGES → CHANGELOG.md} +118 -176
  3. data/README.md +5 -5
  4. data/bin/ruby-prof +1 -4
  5. data/docs/advanced-usage.md +132 -0
  6. data/docs/alternatives.md +98 -0
  7. data/docs/architecture.md +122 -0
  8. data/docs/best-practices.md +27 -0
  9. data/docs/getting-started.md +130 -0
  10. data/docs/history.md +11 -0
  11. data/docs/index.md +45 -0
  12. data/docs/profiling-rails.md +64 -0
  13. data/docs/public/examples/example.rb +33 -0
  14. data/docs/public/examples/generate_reports.rb +92 -0
  15. data/docs/public/examples/reports/call_info.txt +27 -0
  16. data/docs/public/examples/reports/call_stack.html +835 -0
  17. data/docs/public/examples/reports/callgrind.out +150 -0
  18. data/docs/public/examples/reports/flame_graph.html +408 -0
  19. data/docs/public/examples/reports/flat.txt +45 -0
  20. data/docs/public/examples/reports/graph.dot +129 -0
  21. data/docs/public/examples/reports/graph.html +1319 -0
  22. data/docs/public/examples/reports/graph.txt +100 -0
  23. data/docs/public/examples/reports/graphviz_viewer.html +1 -0
  24. data/docs/public/images/call_stack.png +0 -0
  25. data/docs/public/images/class_diagram.png +0 -0
  26. data/docs/public/images/dot_printer.png +0 -0
  27. data/docs/public/images/flame_graph.png +0 -0
  28. data/docs/public/images/flat.png +0 -0
  29. data/docs/public/images/graph.png +0 -0
  30. data/docs/public/images/graph_html.png +0 -0
  31. data/docs/public/images/ruby-prof-logo.svg +1 -0
  32. data/docs/reports.md +150 -0
  33. data/docs/stylesheets/extra.css +80 -0
  34. data/ext/ruby_prof/extconf.rb +23 -22
  35. data/ext/ruby_prof/rp_allocation.c +0 -15
  36. data/ext/ruby_prof/rp_allocation.h +29 -33
  37. data/ext/ruby_prof/rp_call_tree.c +3 -0
  38. data/ext/ruby_prof/rp_call_tree.h +1 -4
  39. data/ext/ruby_prof/rp_call_trees.c +296 -296
  40. data/ext/ruby_prof/rp_call_trees.h +25 -28
  41. data/ext/ruby_prof/rp_measure_allocations.c +47 -47
  42. data/ext/ruby_prof/rp_measure_process_time.c +64 -66
  43. data/ext/ruby_prof/rp_measure_wall_time.c +52 -64
  44. data/ext/ruby_prof/rp_measurement.c +0 -5
  45. data/ext/ruby_prof/rp_measurement.h +49 -53
  46. data/ext/ruby_prof/rp_method.c +554 -551
  47. data/ext/ruby_prof/rp_method.h +1 -4
  48. data/ext/ruby_prof/rp_profile.c +1 -1
  49. data/ext/ruby_prof/rp_profile.h +1 -5
  50. data/ext/ruby_prof/rp_stack.c +212 -212
  51. data/ext/ruby_prof/rp_stack.h +50 -53
  52. data/ext/ruby_prof/rp_thread.h +1 -4
  53. data/ext/ruby_prof/ruby_prof.c +50 -50
  54. data/ext/ruby_prof/ruby_prof.h +4 -6
  55. data/ext/ruby_prof/vc/ruby_prof.vcxproj +7 -8
  56. data/lib/ruby-prof/assets/call_stack_printer.html.erb +746 -711
  57. data/lib/ruby-prof/assets/flame_graph_printer.html.erb +412 -0
  58. data/lib/ruby-prof/assets/graph_printer.html.erb +355 -355
  59. data/lib/ruby-prof/call_tree.rb +57 -57
  60. data/lib/ruby-prof/call_tree_visitor.rb +36 -36
  61. data/lib/ruby-prof/exclude_common_methods.rb +204 -204
  62. data/lib/ruby-prof/measurement.rb +17 -17
  63. data/lib/ruby-prof/printers/abstract_printer.rb +142 -138
  64. data/lib/ruby-prof/printers/call_info_printer.rb +53 -53
  65. data/lib/ruby-prof/printers/call_stack_printer.rb +168 -180
  66. data/lib/ruby-prof/printers/call_tree_printer.rb +132 -145
  67. data/lib/ruby-prof/printers/dot_printer.rb +177 -132
  68. data/lib/ruby-prof/printers/flame_graph_printer.rb +79 -0
  69. data/lib/ruby-prof/printers/flat_printer.rb +52 -52
  70. data/lib/ruby-prof/printers/graph_html_printer.rb +62 -63
  71. data/lib/ruby-prof/printers/graph_printer.rb +112 -113
  72. data/lib/ruby-prof/printers/multi_printer.rb +134 -127
  73. data/lib/ruby-prof/profile.rb +13 -0
  74. data/lib/ruby-prof/rack.rb +114 -105
  75. data/lib/ruby-prof/task.rb +147 -147
  76. data/lib/ruby-prof/thread.rb +20 -20
  77. data/lib/ruby-prof/version.rb +3 -3
  78. data/lib/ruby-prof.rb +50 -52
  79. data/lib/unprof.rb +10 -10
  80. data/ruby-prof.gemspec +66 -65
  81. data/test/abstract_printer_test.rb +25 -27
  82. data/test/alias_test.rb +203 -117
  83. data/test/call_tree_builder.rb +126 -126
  84. data/test/call_tree_visitor_test.rb +27 -27
  85. data/test/call_trees_test.rb +66 -66
  86. data/test/duplicate_names_test.rb +32 -32
  87. data/test/dynamic_method_test.rb +50 -62
  88. data/test/enumerable_test.rb +23 -21
  89. data/test/exceptions_test.rb +24 -24
  90. data/test/exclude_methods_test.rb +363 -257
  91. data/test/exclude_threads_test.rb +48 -48
  92. data/test/fiber_test.rb +195 -195
  93. data/test/gc_test.rb +104 -102
  94. data/test/inverse_call_tree_test.rb +174 -174
  95. data/test/line_number_test.rb +563 -289
  96. data/test/marshal_test.rb +144 -145
  97. data/test/measure_allocations.rb +26 -26
  98. data/test/measure_allocations_test.rb +1511 -1081
  99. data/test/measure_process_time_test.rb +3286 -2477
  100. data/test/measure_times.rb +56 -56
  101. data/test/measure_wall_time_test.rb +773 -568
  102. data/test/measurement_test.rb +82 -82
  103. data/test/merge_test.rb +146 -146
  104. data/test/method_info_test.rb +100 -95
  105. data/test/multi_printer_test.rb +52 -66
  106. data/test/no_method_class_test.rb +15 -15
  107. data/test/pause_resume_test.rb +171 -171
  108. data/test/prime.rb +54 -54
  109. data/test/prime_script.rb +5 -5
  110. data/test/printer_call_stack_test.rb +28 -27
  111. data/test/printer_call_tree_test.rb +30 -30
  112. data/test/printer_flame_graph_test.rb +82 -0
  113. data/test/printer_flat_test.rb +99 -99
  114. data/test/printer_graph_html_test.rb +62 -59
  115. data/test/printer_graph_test.rb +42 -40
  116. data/test/printers_test.rb +162 -135
  117. data/test/printing_recursive_graph_test.rb +81 -81
  118. data/test/profile_test.rb +101 -101
  119. data/test/rack_test.rb +103 -93
  120. data/test/recursive_test.rb +796 -622
  121. data/test/scheduler.rb +4 -0
  122. data/test/singleton_test.rb +39 -38
  123. data/test/stack_printer_test.rb +61 -61
  124. data/test/start_stop_test.rb +106 -106
  125. data/test/test_helper.rb +24 -20
  126. data/test/thread_test.rb +229 -231
  127. data/test/unique_call_path_test.rb +123 -136
  128. data/test/yarv_test.rb +56 -60
  129. metadata +68 -16
  130. data/ext/ruby_prof/rp_measure_memory.c +0 -46
  131. data/lib/ruby-prof/compatibility.rb +0 -113
  132. data/test/compatibility_test.rb +0 -49
  133. data/test/crash2.rb +0 -144
  134. data/test/measure_memory_test.rb +0 -1456
@@ -1,47 +1,47 @@
1
- /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- /* :nodoc: */
5
-
6
- #include "rp_measurement.h"
7
-
8
- static VALUE cMeasureAllocations;
9
- VALUE total_allocated_objects_key;
10
-
11
- static double measure_allocations(rb_trace_arg_t* trace_arg)
12
- {
13
- static double result = 0;
14
-
15
- if (trace_arg)
16
- {
17
- // Only process creation of new objects
18
- rb_event_flag_t event = rb_tracearg_event_flag(trace_arg);
19
- if (event == RUBY_INTERNAL_EVENT_NEWOBJ) {
20
- // Don't count allocations of internal IMemo objects
21
- VALUE object = rb_tracearg_object(trace_arg);
22
- if (BUILTIN_TYPE(object) != T_IMEMO)
23
- result++;
24
- }
25
- }
26
- return result;
27
- }
28
-
29
- prof_measurer_t* prof_measurer_allocations(bool track_allocations)
30
- {
31
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
32
- measure->mode = MEASURE_ALLOCATIONS;
33
- measure->measure = measure_allocations;
34
- measure->multiplier = 1;
35
- // Need to track allocations to get RUBY_INTERNAL_EVENT_NEWOBJ event
36
- measure->track_allocations = track_allocations;
37
-
38
- return measure;
39
- }
40
-
41
- void rp_init_measure_allocations(void)
42
- {
43
- total_allocated_objects_key = ID2SYM(rb_intern("total_allocated_objects"));
44
- rb_define_const(mProf, "ALLOCATIONS", INT2NUM(MEASURE_ALLOCATIONS));
45
-
46
- cMeasureAllocations = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
47
- }
1
+ /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ /* :nodoc: */
5
+
6
+ #include "rp_measurement.h"
7
+
8
+ static VALUE cMeasureAllocations;
9
+ VALUE total_allocated_objects_key;
10
+
11
+ static double measure_allocations(rb_trace_arg_t* trace_arg)
12
+ {
13
+ static double result = 0;
14
+
15
+ if (trace_arg)
16
+ {
17
+ // Only process creation of new objects
18
+ rb_event_flag_t event = rb_tracearg_event_flag(trace_arg);
19
+ if (event == RUBY_INTERNAL_EVENT_NEWOBJ) {
20
+ // Don't count allocations of internal IMemo objects
21
+ VALUE object = rb_tracearg_object(trace_arg);
22
+ if (BUILTIN_TYPE(object) != T_IMEMO)
23
+ result++;
24
+ }
25
+ }
26
+ return result;
27
+ }
28
+
29
+ prof_measurer_t* prof_measurer_allocations(bool track_allocations)
30
+ {
31
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
32
+ measure->mode = MEASURE_ALLOCATIONS;
33
+ measure->measure = measure_allocations;
34
+ measure->multiplier = 1;
35
+ // Need to track allocations to get RUBY_INTERNAL_EVENT_NEWOBJ event
36
+ measure->track_allocations = true;
37
+
38
+ return measure;
39
+ }
40
+
41
+ void rp_init_measure_allocations(void)
42
+ {
43
+ total_allocated_objects_key = ID2SYM(rb_intern("total_allocated_objects"));
44
+ rb_define_const(mProf, "ALLOCATIONS", INT2NUM(MEASURE_ALLOCATIONS));
45
+
46
+ cMeasureAllocations = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
47
+ }
@@ -1,66 +1,64 @@
1
- /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- #include "rp_measurement.h"
5
- #include <time.h>
6
-
7
- static VALUE cMeasureProcessTime;
8
-
9
- static double measure_process_time(rb_trace_arg_t* trace_arg)
10
- {
11
- #if defined(_WIN32)
12
- FILETIME createTime;
13
- FILETIME exitTime;
14
- FILETIME kernelTime;
15
- FILETIME userTime;
16
-
17
- ULARGE_INTEGER kernelTimeInt;
18
- ULARGE_INTEGER userTimeInt;
19
-
20
- GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime);
21
-
22
- kernelTimeInt.LowPart = kernelTime.dwLowDateTime;
23
- kernelTimeInt.HighPart = kernelTime.dwHighDateTime;
24
- userTimeInt.LowPart = userTime.dwLowDateTime;
25
- userTimeInt.HighPart = userTime.dwHighDateTime;
26
-
27
- return (double)(kernelTimeInt.QuadPart + userTimeInt.QuadPart);
28
- #elif !defined(CLOCK_PROCESS_CPUTIME_ID)
29
- #include <sys/resource.h>
30
- struct rusage usage;
31
- getrusage(RUSAGE_SELF, &usage);
32
- return usage.ru_stime.tv_sec + usage.ru_utime.tv_sec + ((usage.ru_stime.tv_usec + usage.ru_utime.tv_usec) / 1000000.0);
33
- #else
34
- struct timespec clock;
35
- clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &clock);
36
- return clock.tv_sec + (clock.tv_nsec / 1000000000.0);
37
- #endif
38
- }
39
-
40
- static double multiplier_process_time(void)
41
- {
42
- #if defined(_WIN32)
43
- // Times are in 100-nanosecond time units. So instead of 10-9 use 10-7
44
- return 1.0 / 10000000.0;
45
- #else
46
- return 1.0;
47
- #endif
48
- }
49
-
50
- prof_measurer_t* prof_measurer_process_time(bool track_allocations)
51
- {
52
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
53
- measure->mode = MEASURE_PROCESS_TIME;
54
- measure->measure = measure_process_time;
55
- measure->multiplier = multiplier_process_time();
56
- measure->track_allocations = track_allocations;
57
- return measure;
58
- }
59
-
60
- void rp_init_measure_process_time(void)
61
- {
62
- rb_define_const(mProf, "CLOCKS_PER_SEC", INT2NUM(CLOCKS_PER_SEC));
63
- rb_define_const(mProf, "PROCESS_TIME", INT2NUM(MEASURE_PROCESS_TIME));
64
-
65
- cMeasureProcessTime = rb_define_class_under(mMeasure, "ProcessTime", rb_cObject);
66
- }
1
+ /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ #include "rp_measurement.h"
5
+
6
+ #if !defined(_WIN32)
7
+ #include <time.h>
8
+ #endif
9
+
10
+ static VALUE cMeasureProcessTime;
11
+
12
+ static double measure_process_time(rb_trace_arg_t* trace_arg)
13
+ {
14
+ #if defined(_WIN32)
15
+ FILETIME createTime;
16
+ FILETIME exitTime;
17
+ FILETIME kernelTime;
18
+ FILETIME userTime;
19
+
20
+ ULARGE_INTEGER kernelTimeInt;
21
+ ULARGE_INTEGER userTimeInt;
22
+
23
+ GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &kernelTime, &userTime);
24
+
25
+ kernelTimeInt.LowPart = kernelTime.dwLowDateTime;
26
+ kernelTimeInt.HighPart = kernelTime.dwHighDateTime;
27
+ userTimeInt.LowPart = userTime.dwLowDateTime;
28
+ userTimeInt.HighPart = userTime.dwHighDateTime;
29
+
30
+ return (double)(kernelTimeInt.QuadPart + userTimeInt.QuadPart);
31
+ #else
32
+ struct timespec clock;
33
+ clock_gettime(CLOCK_PROCESS_CPUTIME_ID, &clock);
34
+ return clock.tv_sec + (clock.tv_nsec / 1000000000.0);
35
+ #endif
36
+ }
37
+
38
+ static double multiplier_process_time(void)
39
+ {
40
+ #if defined(_WIN32)
41
+ // Times are in 100-nanosecond time units. So instead of 10-9 use 10-7
42
+ return 1.0 / 10000000.0;
43
+ #else
44
+ return 1.0;
45
+ #endif
46
+ }
47
+
48
+ prof_measurer_t* prof_measurer_process_time(bool track_allocations)
49
+ {
50
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
51
+ measure->mode = MEASURE_PROCESS_TIME;
52
+ measure->measure = measure_process_time;
53
+ measure->multiplier = multiplier_process_time();
54
+ measure->track_allocations = track_allocations;
55
+ return measure;
56
+ }
57
+
58
+ void rp_init_measure_process_time(void)
59
+ {
60
+ rb_define_const(mProf, "CLOCKS_PER_SEC", INT2NUM(CLOCKS_PER_SEC));
61
+ rb_define_const(mProf, "PROCESS_TIME", INT2NUM(MEASURE_PROCESS_TIME));
62
+
63
+ cMeasureProcessTime = rb_define_class_under(mMeasure, "ProcessTime", rb_cObject);
64
+ }
@@ -1,64 +1,52 @@
1
- /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- /* :nodoc: */
5
- #include "rp_measurement.h"
6
-
7
- #if defined(__APPLE__)
8
- #include <mach/mach_time.h>
9
- #elif !defined(_WIN32)
10
- #include <time.h>
11
- #endif
12
-
13
- static VALUE cMeasureWallTime;
14
-
15
- static double measure_wall_time(rb_trace_arg_t* trace_arg)
16
- {
17
- #if defined(_WIN32)
18
- LARGE_INTEGER time;
19
- QueryPerformanceCounter(&time);
20
- return (double)time.QuadPart;
21
- #elif defined(__APPLE__)
22
- return mach_absolute_time();// * (uint64_t)mach_timebase.numer / (uint64_t)mach_timebase.denom;
23
- #elif defined(__linux__)
24
- struct timespec tv;
25
- clock_gettime(CLOCK_MONOTONIC, &tv);
26
- return tv.tv_sec + (tv.tv_nsec / 1000000000.0);
27
- #else
28
- struct timeval tv;
29
- gettimeofday(&tv, NULL);
30
- return tv.tv_sec + (tv.tv_usec / 1000000.0);
31
- #endif
32
- }
33
-
34
- static double multiplier_wall_time(void)
35
- {
36
- #if defined(_WIN32)
37
- LARGE_INTEGER frequency;
38
- QueryPerformanceFrequency(&frequency);
39
- return 1.0 / frequency.QuadPart;
40
- #elif defined(__APPLE__)
41
- mach_timebase_info_data_t mach_timebase;
42
- mach_timebase_info(&mach_timebase);
43
- return (uint64_t)mach_timebase.numer / (uint64_t)mach_timebase.denom / 1000000000.0;
44
- #else
45
- return 1.0;
46
- #endif
47
- }
48
-
49
- prof_measurer_t* prof_measurer_wall_time(bool track_allocations)
50
- {
51
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
52
- measure->mode = MEASURE_WALL_TIME;
53
- measure->measure = measure_wall_time;
54
- measure->multiplier = multiplier_wall_time();
55
- measure->track_allocations = track_allocations;
56
- return measure;
57
- }
58
-
59
- void rp_init_measure_wall_time(void)
60
- {
61
- rb_define_const(mProf, "WALL_TIME", INT2NUM(MEASURE_WALL_TIME));
62
-
63
- cMeasureWallTime = rb_define_class_under(mMeasure, "WallTime", rb_cObject);
64
- }
1
+ /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ /* :nodoc: */
5
+ #include "rp_measurement.h"
6
+
7
+ #if !defined(_WIN32)
8
+ #include <time.h>
9
+ #endif
10
+
11
+ static VALUE cMeasureWallTime;
12
+
13
+ static double measure_wall_time(rb_trace_arg_t* trace_arg)
14
+ {
15
+ #if defined(_WIN32)
16
+ LARGE_INTEGER time;
17
+ QueryPerformanceCounter(&time);
18
+ return (double)time.QuadPart;
19
+ #else
20
+ struct timespec tv;
21
+ clock_gettime(CLOCK_MONOTONIC, &tv);
22
+ return tv.tv_sec + (tv.tv_nsec / 1000000000.0);
23
+ #endif
24
+ }
25
+
26
+ static double multiplier_wall_time(void)
27
+ {
28
+ #if defined(_WIN32)
29
+ LARGE_INTEGER frequency;
30
+ QueryPerformanceFrequency(&frequency);
31
+ return 1.0 / frequency.QuadPart;
32
+ #else
33
+ return 1.0;
34
+ #endif
35
+ }
36
+
37
+ prof_measurer_t* prof_measurer_wall_time(bool track_allocations)
38
+ {
39
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
40
+ measure->mode = MEASURE_WALL_TIME;
41
+ measure->measure = measure_wall_time;
42
+ measure->multiplier = multiplier_wall_time();
43
+ measure->track_allocations = track_allocations;
44
+ return measure;
45
+ }
46
+
47
+ void rp_init_measure_wall_time(void)
48
+ {
49
+ rb_define_const(mProf, "WALL_TIME", INT2NUM(MEASURE_WALL_TIME));
50
+
51
+ cMeasureWallTime = rb_define_class_under(mMeasure, "WallTime", rb_cObject);
52
+ }
@@ -7,12 +7,10 @@ VALUE mMeasure;
7
7
  VALUE cRpMeasurement;
8
8
 
9
9
  prof_measurer_t* prof_measurer_allocations(bool track_allocations);
10
- prof_measurer_t* prof_measurer_memory(bool track_allocations);
11
10
  prof_measurer_t* prof_measurer_process_time(bool track_allocations);
12
11
  prof_measurer_t* prof_measurer_wall_time(bool track_allocations);
13
12
 
14
13
  void rp_init_measure_allocations(void);
15
- void rp_init_measure_memory(void);
16
14
  void rp_init_measure_process_time(void);
17
15
  void rp_init_measure_wall_time(void);
18
16
 
@@ -26,8 +24,6 @@ prof_measurer_t* prof_measurer_create(prof_measure_mode_t measure, bool track_al
26
24
  return prof_measurer_process_time(track_allocations);
27
25
  case MEASURE_ALLOCATIONS:
28
26
  return prof_measurer_allocations(track_allocations);
29
- case MEASURE_MEMORY:
30
- return prof_measurer_memory(track_allocations);
31
27
  default:
32
28
  rb_raise(rb_eArgError, "Unknown measure mode: %d", measure);
33
29
  }
@@ -342,7 +338,6 @@ void rp_init_measure(void)
342
338
  rp_init_measure_wall_time();
343
339
  rp_init_measure_process_time();
344
340
  rp_init_measure_allocations();
345
- rp_init_measure_memory();
346
341
 
347
342
  cRpMeasurement = rb_define_class_under(mProf, "Measurement", rb_cObject);
348
343
  rb_define_alloc_func(cRpMeasurement, prof_measurement_allocate);
@@ -1,53 +1,49 @@
1
- /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
- Please see the LICENSE file for copyright and distribution information */
3
-
4
- #ifndef __rp_measurementMENT_H__
5
- #define __rp_measurementMENT_H__
6
-
7
- #include "ruby_prof.h"
8
-
9
- extern VALUE mMeasure;
10
-
11
- typedef double (*get_measurement)(rb_trace_arg_t* trace_arg);
12
-
13
- typedef enum
14
- {
15
- MEASURE_WALL_TIME,
16
- MEASURE_PROCESS_TIME,
17
- MEASURE_ALLOCATIONS,
18
- MEASURE_MEMORY
19
- } prof_measure_mode_t;
20
-
21
- typedef struct prof_measurer_t
22
- {
23
- get_measurement measure;
24
- prof_measure_mode_t mode;
25
- double multiplier;
26
- bool track_allocations;
27
- } prof_measurer_t;
28
-
29
- /* Callers and callee information for a method. */
30
- typedef struct prof_measurement_t
31
- {
32
- prof_owner_t owner;
33
- double total_time;
34
- double self_time;
35
- double wait_time;
36
- int called;
37
- VALUE object;
38
- } prof_measurement_t;
39
-
40
- prof_measurer_t* prof_measurer_create(prof_measure_mode_t measure, bool track_allocations);
41
- double prof_measure(prof_measurer_t* measurer, rb_trace_arg_t* trace_arg);
42
-
43
- prof_measurement_t* prof_measurement_create(void);
44
- prof_measurement_t* prof_measurement_copy(prof_measurement_t* other);
45
- void prof_measurement_free(prof_measurement_t* measurement);
46
- VALUE prof_measurement_wrap(prof_measurement_t* measurement);
47
- prof_measurement_t* prof_get_measurement(VALUE self);
48
- void prof_measurement_mark(void* data);
49
- void prof_measurement_merge_internal(prof_measurement_t* destination, prof_measurement_t* other);
50
-
51
- void rp_init_measure(void);
52
-
53
- #endif //__rp_measurementMENT_H__
1
+ /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
2
+ Please see the LICENSE file for copyright and distribution information */
3
+
4
+ #pragma once
5
+
6
+ #include "ruby_prof.h"
7
+
8
+ extern VALUE mMeasure;
9
+
10
+ typedef double (*get_measurement)(rb_trace_arg_t* trace_arg);
11
+
12
+ typedef enum
13
+ {
14
+ MEASURE_WALL_TIME,
15
+ MEASURE_PROCESS_TIME,
16
+ MEASURE_ALLOCATIONS
17
+ } prof_measure_mode_t;
18
+
19
+ typedef struct prof_measurer_t
20
+ {
21
+ get_measurement measure;
22
+ prof_measure_mode_t mode;
23
+ double multiplier;
24
+ bool track_allocations;
25
+ } prof_measurer_t;
26
+
27
+ /* Callers and callee information for a method. */
28
+ typedef struct prof_measurement_t
29
+ {
30
+ prof_owner_t owner;
31
+ double total_time;
32
+ double self_time;
33
+ double wait_time;
34
+ int called;
35
+ VALUE object;
36
+ } prof_measurement_t;
37
+
38
+ prof_measurer_t* prof_measurer_create(prof_measure_mode_t measure, bool track_allocations);
39
+ double prof_measure(prof_measurer_t* measurer, rb_trace_arg_t* trace_arg);
40
+
41
+ prof_measurement_t* prof_measurement_create(void);
42
+ prof_measurement_t* prof_measurement_copy(prof_measurement_t* other);
43
+ void prof_measurement_free(prof_measurement_t* measurement);
44
+ VALUE prof_measurement_wrap(prof_measurement_t* measurement);
45
+ prof_measurement_t* prof_get_measurement(VALUE self);
46
+ void prof_measurement_mark(void* data);
47
+ void prof_measurement_merge_internal(prof_measurement_t* destination, prof_measurement_t* other);
48
+
49
+ void rp_init_measure(void);