ruby-prof 0.18.0-x64-mingw32 → 1.1.0-x64-mingw32

Sign up to get free protection for your applications and to get access to all the features.
Files changed (119) hide show
  1. checksums.yaml +4 -4
  2. data/CHANGES +32 -0
  3. data/LICENSE +2 -2
  4. data/README.rdoc +1 -483
  5. data/Rakefile +3 -6
  6. data/bin/ruby-prof +65 -30
  7. data/ext/ruby_prof/extconf.rb +6 -38
  8. data/ext/ruby_prof/rp_allocation.c +279 -0
  9. data/ext/ruby_prof/rp_allocation.h +31 -0
  10. data/ext/ruby_prof/rp_call_info.c +129 -283
  11. data/ext/ruby_prof/rp_call_info.h +16 -34
  12. data/ext/ruby_prof/rp_measure_allocations.c +25 -49
  13. data/ext/ruby_prof/rp_measure_memory.c +21 -56
  14. data/ext/ruby_prof/rp_measure_process_time.c +35 -39
  15. data/ext/ruby_prof/rp_measure_wall_time.c +36 -19
  16. data/ext/ruby_prof/rp_measurement.c +230 -0
  17. data/ext/ruby_prof/rp_measurement.h +50 -0
  18. data/ext/ruby_prof/rp_method.c +389 -389
  19. data/ext/ruby_prof/rp_method.h +34 -39
  20. data/ext/ruby_prof/rp_profile.c +895 -0
  21. data/ext/ruby_prof/rp_profile.h +37 -0
  22. data/ext/ruby_prof/rp_stack.c +103 -80
  23. data/ext/ruby_prof/rp_stack.h +5 -12
  24. data/ext/ruby_prof/rp_thread.c +143 -83
  25. data/ext/ruby_prof/rp_thread.h +15 -6
  26. data/ext/ruby_prof/ruby_prof.c +11 -757
  27. data/ext/ruby_prof/ruby_prof.h +4 -47
  28. data/ext/ruby_prof/vc/ruby_prof.vcxproj +10 -8
  29. data/lib/{2.6.3 → 2.6.5}/ruby_prof.so +0 -0
  30. data/lib/ruby-prof.rb +2 -18
  31. data/lib/ruby-prof/assets/call_stack_printer.html.erb +713 -0
  32. data/lib/ruby-prof/assets/call_stack_printer.png +0 -0
  33. data/lib/ruby-prof/assets/graph_printer.html.erb +356 -0
  34. data/lib/ruby-prof/call_info.rb +35 -93
  35. data/lib/ruby-prof/call_info_visitor.rb +19 -21
  36. data/lib/ruby-prof/compatibility.rb +37 -107
  37. data/lib/ruby-prof/exclude_common_methods.rb +198 -0
  38. data/lib/ruby-prof/measurement.rb +14 -0
  39. data/lib/ruby-prof/method_info.rb +52 -83
  40. data/lib/ruby-prof/printers/abstract_printer.rb +73 -50
  41. data/lib/ruby-prof/printers/call_info_printer.rb +13 -3
  42. data/lib/ruby-prof/printers/call_stack_printer.rb +62 -145
  43. data/lib/ruby-prof/printers/call_tree_printer.rb +20 -12
  44. data/lib/ruby-prof/printers/dot_printer.rb +5 -5
  45. data/lib/ruby-prof/printers/flat_printer.rb +6 -24
  46. data/lib/ruby-prof/printers/graph_html_printer.rb +6 -192
  47. data/lib/ruby-prof/printers/graph_printer.rb +13 -15
  48. data/lib/ruby-prof/printers/multi_printer.rb +66 -23
  49. data/lib/ruby-prof/profile.rb +10 -3
  50. data/lib/ruby-prof/rack.rb +0 -3
  51. data/lib/ruby-prof/thread.rb +12 -12
  52. data/lib/ruby-prof/version.rb +1 -1
  53. data/ruby-prof.gemspec +2 -2
  54. data/test/abstract_printer_test.rb +0 -27
  55. data/test/alias_test.rb +129 -0
  56. data/test/basic_test.rb +41 -40
  57. data/test/call_info_visitor_test.rb +3 -3
  58. data/test/dynamic_method_test.rb +0 -2
  59. data/test/fiber_test.rb +11 -17
  60. data/test/gc_test.rb +96 -0
  61. data/test/line_number_test.rb +120 -39
  62. data/test/marshal_test.rb +119 -0
  63. data/test/measure_allocations.rb +30 -0
  64. data/test/measure_allocations_test.rb +371 -12
  65. data/test/measure_allocations_trace_test.rb +385 -0
  66. data/test/measure_memory_trace_test.rb +756 -0
  67. data/test/measure_process_time_test.rb +821 -33
  68. data/test/measure_times.rb +54 -0
  69. data/test/measure_wall_time_test.rb +349 -145
  70. data/test/multi_printer_test.rb +1 -34
  71. data/test/parser_timings.rb +24 -0
  72. data/test/pause_resume_test.rb +5 -5
  73. data/test/prime.rb +2 -0
  74. data/test/printer_call_stack_test.rb +28 -0
  75. data/test/printer_call_tree_test.rb +31 -0
  76. data/test/printer_flat_test.rb +68 -0
  77. data/test/printer_graph_html_test.rb +60 -0
  78. data/test/printer_graph_test.rb +41 -0
  79. data/test/printers_test.rb +32 -166
  80. data/test/printing_recursive_graph_test.rb +26 -72
  81. data/test/recursive_test.rb +72 -77
  82. data/test/stack_printer_test.rb +2 -15
  83. data/test/start_stop_test.rb +22 -25
  84. data/test/test_helper.rb +5 -248
  85. data/test/thread_test.rb +11 -54
  86. data/test/unique_call_path_test.rb +16 -28
  87. data/test/yarv_test.rb +1 -0
  88. metadata +28 -36
  89. data/examples/flat.txt +0 -50
  90. data/examples/graph.dot +0 -84
  91. data/examples/graph.html +0 -823
  92. data/examples/graph.txt +0 -139
  93. data/examples/multi.flat.txt +0 -23
  94. data/examples/multi.graph.html +0 -760
  95. data/examples/multi.grind.dat +0 -114
  96. data/examples/multi.stack.html +0 -547
  97. data/examples/stack.html +0 -547
  98. data/ext/ruby_prof/rp_measure.c +0 -40
  99. data/ext/ruby_prof/rp_measure.h +0 -45
  100. data/ext/ruby_prof/rp_measure_cpu_time.c +0 -136
  101. data/ext/ruby_prof/rp_measure_gc_runs.c +0 -73
  102. data/ext/ruby_prof/rp_measure_gc_time.c +0 -60
  103. data/lib/ruby-prof/aggregate_call_info.rb +0 -76
  104. data/lib/ruby-prof/assets/call_stack_printer.css.html +0 -117
  105. data/lib/ruby-prof/assets/call_stack_printer.js.html +0 -385
  106. data/lib/ruby-prof/printers/flat_printer_with_line_numbers.rb +0 -83
  107. data/lib/ruby-prof/profile/exclude_common_methods.rb +0 -207
  108. data/lib/ruby-prof/profile/legacy_method_elimination.rb +0 -50
  109. data/test/aggregate_test.rb +0 -136
  110. data/test/block_test.rb +0 -74
  111. data/test/call_info_test.rb +0 -78
  112. data/test/issue137_test.rb +0 -63
  113. data/test/measure_cpu_time_test.rb +0 -212
  114. data/test/measure_gc_runs_test.rb +0 -32
  115. data/test/measure_gc_time_test.rb +0 -36
  116. data/test/measure_memory_test.rb +0 -33
  117. data/test/method_elimination_test.rb +0 -84
  118. data/test/module_test.rb +0 -45
  119. data/test/stack_test.rb +0 -138
@@ -4,50 +4,32 @@
4
4
  #ifndef __RP_CALL_INFO_H__
5
5
  #define __RP_CALL_INFO_H__
6
6
 
7
- #include "rp_measure.h"
7
+ #include "ruby_prof.h"
8
+ #include "rp_measurement.h"
8
9
  #include "rp_method.h"
9
10
 
10
- extern VALUE cCallInfo;
11
-
12
11
  /* Callers and callee information for a method. */
13
12
  typedef struct prof_call_info_t
14
13
  {
15
- prof_method_t *target; /* Use target instead of method to avoid conflict with Ruby method */
16
- struct prof_call_info_t *parent;
17
- st_table *call_infos;
18
-
19
- double total_time;
20
- double self_time;
21
- double wait_time;
22
-
14
+ prof_method_t *method;
15
+ prof_method_t *parent;
16
+ prof_measurement_t *measurement;
23
17
  VALUE object;
24
- VALUE children;
25
18
 
26
- int called;
19
+ int visits; /* Current visits on the stack */
27
20
 
28
- unsigned int recursive : 1;
29
- unsigned int depth : 15;
30
- unsigned int line : 16;
21
+ unsigned int depth;
22
+ unsigned int source_line;
23
+ VALUE source_file;
31
24
  } prof_call_info_t;
32
25
 
33
- /* Array of call_info objects */
34
- typedef struct prof_call_infos_t
35
- {
36
- prof_call_info_t **start;
37
- prof_call_info_t **end;
38
- prof_call_info_t **ptr;
39
- VALUE object;
40
- } prof_call_infos_t;
41
-
42
-
26
+ prof_call_info_t *prof_call_info_create(prof_method_t *method, prof_method_t *parent, VALUE source_file, int source_line);
27
+ void prof_call_info_mark(void *data);
28
+ prof_call_info_t *call_info_table_lookup(st_table* table, st_data_t key);
29
+ size_t call_info_table_insert(st_table *table, st_data_t key, prof_call_info_t *val);
30
+ prof_call_info_t *prof_get_call_info(VALUE self);
31
+ VALUE prof_call_info_wrap(prof_call_info_t* call_info);
32
+ void prof_call_info_free(prof_call_info_t* call_info);
43
33
  void rp_init_call_info(void);
44
- prof_call_infos_t* prof_call_infos_create();
45
- void prof_call_infos_mark(prof_call_infos_t *call_infos);
46
- void prof_call_infos_free(prof_call_infos_t *call_infos);
47
- void prof_add_call_info(prof_call_infos_t *call_infos, prof_call_info_t *call_info);
48
- VALUE prof_call_infos_wrap(prof_call_infos_t *call_infos);
49
- prof_call_info_t * prof_call_info_create(prof_method_t* method, prof_call_info_t* parent);
50
- prof_call_info_t * call_info_table_lookup(st_table *table, const prof_method_key_t *key);
51
- size_t call_info_table_insert(st_table *table, const prof_method_key_t *key, prof_call_info_t *val);
52
34
 
53
35
  #endif //__RP_CALL_INFO_H__
@@ -3,74 +3,50 @@
3
3
 
4
4
  /* :nodoc: */
5
5
 
6
- #include "ruby_prof.h"
6
+ #include "rp_measurement.h"
7
7
 
8
8
  static VALUE cMeasureAllocations;
9
+ VALUE total_allocated_objects_key;
9
10
 
10
- #if defined(HAVE_RB_OS_ALLOCATED_OBJECTS)
11
- unsigned LONG_LONG rb_os_allocated_objects();
12
- #endif
13
-
14
- #if defined(HAVE_RB_GC_STAT)
15
- size_t rb_gc_stat(VALUE key);
16
-
17
- #if RUBY_PROF_RUBY_VERSION >= 20200
18
- #define TOTAL_ALLOCATED_OBJECTS_STRING "total_allocated_objects"
19
- #else
20
- #define TOTAL_ALLOCATED_OBJECTS_STRING "total_allocated_object"
21
- #endif
22
-
23
- #endif
11
+ static double
12
+ measure_allocations_via_gc_stats(rb_trace_arg_t* trace_arg)
13
+ {
14
+ return rb_gc_stat(total_allocated_objects_key);
15
+ }
24
16
 
25
17
  static double
26
- measure_allocations()
18
+ measure_allocations_via_tracing(rb_trace_arg_t* trace_arg)
27
19
  {
28
- #if defined(HAVE_RB_OS_ALLOCATED_OBJECTS)
29
- #define MEASURE_ALLOCATIONS_ENABLED Qtrue
30
- return rb_os_allocated_objects();
20
+ static double result = 0;
31
21
 
32
- #elif defined(HAVE_RB_GC_STAT) && RUBY_PROF_RUBY_VERSION >= 20100
33
- #define MEASURE_ALLOCATIONS_ENABLED Qtrue
34
- static VALUE total_alloc_symbol = 0;
35
- if (!total_alloc_symbol) {
36
- total_alloc_symbol = ID2SYM(rb_intern_const(TOTAL_ALLOCATED_OBJECTS_STRING));
22
+ if (trace_arg)
23
+ {
24
+ rb_event_flag_t event = rb_tracearg_event_flag(trace_arg);
25
+ if (event == RUBY_INTERNAL_EVENT_NEWOBJ)
26
+ result++;
37
27
  }
38
- return rb_gc_stat(total_alloc_symbol);
39
-
40
- #else
41
- #define MEASURE_ALLOCATIONS_ENABLED Qfalse
42
- return 0;
43
- #endif
28
+ return result;
44
29
  }
45
30
 
46
-
47
- prof_measurer_t* prof_measurer_allocations()
31
+ prof_measurer_t* prof_measurer_allocations(bool track_allocations)
48
32
  {
49
33
  prof_measurer_t* measure = ALLOC(prof_measurer_t);
50
- measure->measure = measure_allocations;
51
- return measure;
52
- }
34
+ measure->mode = MEASURE_ALLOCATIONS;
35
+ measure->multiplier = 1;
36
+ measure->track_allocations = track_allocations;
53
37
 
54
- /* call-seq:
55
- measure -> int
38
+ if (track_allocations)
39
+ measure->measure = measure_allocations_via_tracing;
40
+ else
41
+ measure->measure = measure_allocations_via_gc_stats;
56
42
 
57
- Returns the number of Ruby object allocations. */
58
-
59
- static VALUE
60
- prof_measure_allocations(VALUE self)
61
- {
62
- #if defined(HAVE_LONG_LONG)
63
- return ULL2NUM(measure_allocations());
64
- #else
65
- return ULONG2NUM(measure_allocations());
66
- #endif
43
+ return measure;
67
44
  }
68
45
 
69
46
  void rp_init_measure_allocations()
70
47
  {
48
+ total_allocated_objects_key = ID2SYM(rb_intern("total_allocated_objects"));
71
49
  rb_define_const(mProf, "ALLOCATIONS", INT2NUM(MEASURE_ALLOCATIONS));
72
- rb_define_const(mProf, "ALLOCATIONS_ENABLED", MEASURE_ALLOCATIONS_ENABLED);
73
50
 
74
51
  cMeasureAllocations = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
75
- rb_define_singleton_method(cMeasureAllocations, "measure", prof_measure_allocations, 0);
76
52
  }
@@ -1,77 +1,42 @@
1
- /* Copyright (C) 2005-2019 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
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
4
  /* :nodoc: */
5
5
 
6
- #include "ruby_prof.h"
6
+ #include "rp_measurement.h"
7
7
 
8
8
  static VALUE cMeasureMemory;
9
9
 
10
-
11
- #if defined(HAVE_RB_GC_ALLOCATED_SIZE)
12
- VALUE rb_gc_allocated_size();
13
- #endif
14
-
15
- #if defined(HAVE_RB_GC_MALLOC_ALLOCATED_SIZE)
16
- size_t rb_gc_malloc_allocated_size();
17
- #endif
18
-
19
- #if defined(HAVE_RB_HEAP_TOTAL_MEM)
20
- //FIXME: did not find the patch to check prototype, assuming it to return size_t
21
- size_t rb_heap_total_mem();
22
- #endif
23
-
24
10
  static double
25
- measure_memory()
11
+ measure_memory_via_tracing(rb_trace_arg_t* trace_arg)
26
12
  {
27
- #if defined(HAVE_RB_GC_ALLOCATED_SIZE)
28
- #define MEASURE_MEMORY_ENABLED Qtrue
29
- #if defined(HAVE_LONG_LONG)
30
- return NUM2LL(rb_gc_allocated_size()) / 1024.0;
31
- #else
32
- return NUM2ULONG(rb_gc_allocated_size()) / 1024.0;
33
- #endif
34
-
35
- #elif defined(HAVE_RB_GC_MALLOC_ALLOCATED_SIZE)
36
- #define MEASURE_MEMORY_ENABLED Qtrue
37
- return rb_gc_malloc_allocated_size() / 1024.0;
38
-
39
- #elif defined(HAVE_RB_GC_TOTAL_MALLOCED_BYTES)
40
- #define MEASURE_MEMORY_ENABLED Qtrue
41
- return rb_gc_total_malloced_bytes() / 1024.0;
42
-
43
- #elif defined(HAVE_RB_HEAP_TOTAL_MEM)
44
- #define MEASURE_MEMORY_ENABLED Qtrue
45
- return rb_heap_total_mem() / 1024.0;
46
-
47
- #else
48
- #define MEASURE_MEMORY_ENABLED Qfalse
49
- return 0;
50
- #endif
13
+ static double result = 0;
14
+
15
+ if (trace_arg)
16
+ {
17
+ rb_event_flag_t event = rb_tracearg_event_flag(trace_arg);
18
+ if (event == RUBY_INTERNAL_EVENT_NEWOBJ)
19
+ {
20
+ VALUE object = rb_tracearg_object(trace_arg);
21
+ result += rb_obj_memsize_of(object);
22
+ }
23
+ }
24
+ return result;
51
25
  }
52
26
 
53
- prof_measurer_t* prof_measurer_memory()
27
+ prof_measurer_t* prof_measurer_memory(bool track_allocations)
54
28
  {
55
29
  prof_measurer_t* measure = ALLOC(prof_measurer_t);
56
- measure->measure = measure_memory;
30
+ measure->mode = MEASURE_MEMORY;
31
+ measure->measure = measure_memory_via_tracing;
32
+ measure->multiplier = 1;
33
+ measure->track_allocations = true;
57
34
  return measure;
58
35
  }
59
36
 
60
- /* call-seq:
61
- measure_process_time -> float
62
-
63
- Returns the process time.*/
64
- static VALUE
65
- prof_measure_memory(VALUE self)
66
- {
67
- return rb_float_new(measure_memory());
68
- }
69
-
70
37
  void rp_init_measure_memory()
71
38
  {
72
39
  rb_define_const(mProf, "MEMORY", INT2NUM(MEASURE_MEMORY));
73
- rb_define_const(mProf, "MEMORY_ENABLED", MEASURE_MEMORY_ENABLED);
74
40
 
75
- cMeasureMemory = rb_define_class_under(mMeasure, "Memory", rb_cObject);
76
- rb_define_singleton_method(cMeasureMemory, "measure", prof_measure_memory, 0);
41
+ cMeasureMemory = rb_define_class_under(mMeasure, "Allocations", rb_cObject);
77
42
  }
@@ -1,71 +1,67 @@
1
- /* Copyright (C) 2005-2013 Shugo Maeda <shugo@ruby-lang.org> and Charlie Savage <cfis@savagexi.com>
1
+ /* Copyright (C) 2005-2019 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
- #include "ruby_prof.h"
4
+ #include "rp_measurement.h"
5
5
  #include <time.h>
6
6
 
7
7
  static VALUE cMeasureProcessTime;
8
8
 
9
9
  static double
10
- measure_process_time()
10
+ measure_process_time(rb_trace_arg_t* trace_arg)
11
11
  {
12
- #if defined(__linux__)
13
- struct timespec clock;
14
- clock_gettime(CLOCK_PROCESS_CPUTIME_ID , &clock);
15
- return clock.tv_sec + (clock.tv_nsec/1000000000.0);
16
- #elif defined(_win32)
17
- FILETIME createTime;
18
- FILETIME exitTime;
19
- FILETIME sysTime;
20
- FILETIME cpuTime;
21
-
22
- ULARGE_INTEGER sysTimeInt;
23
- ULARGE_INTEGER cpuTimeInt;
24
- ULONGLONG totalTime;
12
+ #if defined(_WIN32)
13
+ FILETIME createTime;
14
+ FILETIME exitTime;
15
+ FILETIME sysTime;
16
+ FILETIME userTime;
25
17
 
26
- GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &sysTime, &cpuTime);
18
+ ULARGE_INTEGER sysTimeInt;
19
+ ULARGE_INTEGER userTimeInt;
27
20
 
28
- /* Doing this based on MSFT's recommendation in the FILETIME structure documentation at
29
- http://msdn.microsoft.com/en-us/library/ms724284%28VS.85%29.aspx*/
21
+ GetProcessTimes(GetCurrentProcess(), &createTime, &exitTime, &sysTime, &userTime);
30
22
 
31
- sysTimeInt.LowPart = sysTime.dwLowDateTime;
32
- sysTimeInt.HighPart = sysTime.dwHighDateTime;
33
- cpuTimeInt.LowPart = cpuTime.dwLowDateTime;
34
- cpuTimeInt.HighPart = cpuTime.dwHighDateTime;
23
+ sysTimeInt.LowPart = sysTime.dwLowDateTime;
24
+ sysTimeInt.HighPart = sysTime.dwHighDateTime;
25
+ userTimeInt.LowPart = userTime.dwLowDateTime;
26
+ userTimeInt.HighPart = userTime.dwHighDateTime;
35
27
 
36
- totalTime = sysTimeInt.QuadPart + cpuTimeInt.QuadPart;
37
-
38
- // Times are in 100-nanosecond time units. So instead of 10-9 use 10-7
39
- return totalTime / 10000000.0;
28
+ return sysTimeInt.QuadPart + userTimeInt.QuadPart;
29
+ #elif !defined(CLOCK_PROCESS_CPUTIME_ID)
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);
40
33
  #else
41
- return ((double)clock()) / CLOCKS_PER_SEC;
34
+ struct timespec clock;
35
+ clock_gettime(CLOCK_PROCESS_CPUTIME_ID , &clock);
36
+ return clock.tv_sec + (clock.tv_nsec/1000000000.0);
42
37
  #endif
43
38
  }
44
39
 
45
- /* call-seq:
46
- measure_process_time -> float
47
-
48
- Returns the process time.*/
49
- static VALUE
50
- prof_measure_process_time(VALUE self)
40
+ static double
41
+ multiplier_process_time(void)
51
42
  {
52
- return rb_float_new(measure_process_time());
43
+ #if defined(_WIN32)
44
+ // Times are in 100-nanosecond time units. So instead of 10-9 use 10-7
45
+ return 1.0 / 10000000.0;
46
+ #else
47
+ return 1.0;
48
+ #endif
53
49
  }
54
50
 
55
- prof_measurer_t* prof_measurer_process_time()
51
+ prof_measurer_t* prof_measurer_process_time(bool track_allocations)
56
52
  {
57
53
  prof_measurer_t* measure = ALLOC(prof_measurer_t);
54
+ measure->mode = MEASURE_PROCESS_TIME;
58
55
  measure->measure = measure_process_time;
56
+ measure->multiplier = multiplier_process_time();
57
+ measure->track_allocations = track_allocations;
59
58
  return measure;
60
59
  }
61
60
 
62
-
63
61
  void rp_init_measure_process_time()
64
62
  {
65
63
  rb_define_const(mProf, "CLOCKS_PER_SEC", INT2NUM(CLOCKS_PER_SEC));
66
64
  rb_define_const(mProf, "PROCESS_TIME", INT2NUM(MEASURE_PROCESS_TIME));
67
- rb_define_const(mProf, "PROCESS_TIME_ENABLED", Qtrue);
68
65
 
69
66
  cMeasureProcessTime = rb_define_class_under(mMeasure, "ProcessTime", rb_cObject);
70
- rb_define_singleton_method(cMeasureProcessTime, "measure", prof_measure_process_time, 0);
71
67
  }
@@ -2,44 +2,61 @@
2
2
  Please see the LICENSE file for copyright and distribution information */
3
3
 
4
4
  /* :nodoc: */
5
- #include "ruby_prof.h"
6
- #if HAVE_GETTIMEOFDAY && !defined(_WIN32)
7
- #include <sys/time.h>
5
+ #include "rp_measurement.h"
6
+
7
+ #if defined(__APPLE__)
8
+ #include <mach/mach_time.h>
9
+ #elif !defined(_WIN32)
10
+ #include <time.h>
8
11
  #endif
9
12
 
10
13
  static VALUE cMeasureWallTime;
11
14
 
12
15
  static double
13
- measure_wall_time()
16
+ measure_wall_time(rb_trace_arg_t* trace_arg)
14
17
  {
18
+ #if defined(_WIN32)
19
+ return GetTickCount();
20
+ #elif defined(__APPLE__)
21
+ return mach_absolute_time();// * (uint64_t)mach_timebase.numer / (uint64_t)mach_timebase.denom;
22
+ #elif defined(__linux__)
23
+ struct timespec tv;
24
+ clock_gettime(CLOCK_MONOTONIC, &tv);
25
+ return tv.tv_sec + (tv.tv_nsec / 1000000000.0);
26
+ #else
15
27
  struct timeval tv;
16
28
  gettimeofday(&tv, NULL);
17
- return tv.tv_sec + (tv.tv_usec/1000000.0);
29
+ return tv.tv_sec + (tv.tv_usec / 1000000.0);
30
+ #endif
18
31
  }
19
32
 
20
- prof_measurer_t* prof_measurer_wall_time()
33
+ static double
34
+ multiplier_wall_time(void)
21
35
  {
22
- prof_measurer_t* measure = ALLOC(prof_measurer_t);
23
- measure->measure = measure_wall_time;
24
- return measure;
36
+ #if defined(_WIN32)
37
+ return 1.0/1000.0;
38
+ #elif defined(__APPLE__)
39
+ mach_timebase_info_data_t mach_timebase;
40
+ mach_timebase_info (&mach_timebase);
41
+ return (uint64_t)mach_timebase.numer / (uint64_t)mach_timebase.denom / 1000000000.0;
42
+ #else
43
+ return 1.0;
44
+ #endif
25
45
  }
26
46
 
27
- /* Document-method: prof_measure_wall_time
28
- call-seq:
29
- measure_wall_time -> float
30
-
31
- Returns the wall time.*/
32
- static VALUE
33
- prof_measure_wall_time(VALUE self)
47
+ prof_measurer_t* prof_measurer_wall_time(bool track_allocations)
34
48
  {
35
- return rb_float_new(measure_wall_time());
49
+ prof_measurer_t* measure = ALLOC(prof_measurer_t);
50
+ measure->mode = MEASURE_WALL_TIME;
51
+ measure->measure = measure_wall_time;
52
+ measure->multiplier = multiplier_wall_time();
53
+ measure->track_allocations = track_allocations;
54
+ return measure;
36
55
  }
37
56
 
38
57
  void rp_init_measure_wall_time()
39
58
  {
40
59
  rb_define_const(mProf, "WALL_TIME", INT2NUM(MEASURE_WALL_TIME));
41
- rb_define_const(mProf, "WALL_TIME_ENABLED", Qtrue);
42
60
 
43
61
  cMeasureWallTime = rb_define_class_under(mMeasure, "WallTime", rb_cObject);
44
- rb_define_singleton_method(cMeasureWallTime, "measure", prof_measure_wall_time, 0);
45
62
  }