tmm1-perftools.rb 0.1.4 → 0.1.5

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.
@@ -52,4 +52,5 @@ when /darwin/, /linux/
52
52
  end
53
53
 
54
54
  $libs = append_library($libs, 'profiler')
55
+ have_func('rb_during_gc', 'ruby.h')
55
56
  create_makefile 'perftools'
@@ -2,6 +2,26 @@
2
2
  #include <node.h>
3
3
  #include <env.h>
4
4
 
5
+ static VALUE Iallocate;
6
+
7
+ void
8
+ save_frame(struct FRAME *frame, void** result, int *depth)
9
+ {
10
+ VALUE klass = frame->last_class;
11
+ // XXX what is an ICLASS anyway?
12
+ // if (BUILTIN_TYPE(klass) == T_ICLASS)
13
+ // klass = RBASIC(klass)->klass;
14
+
15
+ if (FL_TEST(klass, FL_SINGLETON) &&
16
+ (BUILTIN_TYPE(frame->self) == T_CLASS || BUILTIN_TYPE(frame->self) == T_MODULE))
17
+ result[(*depth)++] = (void*) frame->self;
18
+ else
19
+ result[(*depth)++] = 0;
20
+
21
+ result[(*depth)++] = (void*) klass;
22
+ result[(*depth)++] = (void*) (frame->last_func == ID_ALLOCATOR ? Iallocate : frame->last_func);
23
+ }
24
+
5
25
  int
6
26
  rb_stack_trace(void** result, int max_depth)
7
27
  {
@@ -9,30 +29,26 @@ rb_stack_trace(void** result, int max_depth)
9
29
  struct FRAME *frame = ruby_frame;
10
30
  NODE *n;
11
31
 
12
- if (max_depth == 0) return 0;
32
+ if (max_depth == 0)
33
+ return 0;
34
+
35
+ // XXX: figure out what these mean. is there a way to access them from an extension?
13
36
  // if (rb_prohibit_interrupt || !rb_trap_immediate) return 0;
14
37
 
38
+ #ifdef HAVE_RB_DURING_GC
15
39
  if (rb_during_gc()) {
16
40
  result[0] = rb_gc;
17
41
  return 1;
18
42
  }
43
+ #endif
19
44
 
45
+ // XXX does it make sense to track allocations or not?
20
46
  if (frame->last_func == ID_ALLOCATOR) {
21
47
  frame = frame->prev;
22
48
  }
23
49
 
24
50
  if (frame->last_func) {
25
- VALUE klass = frame->last_class;
26
- // if (BUILTIN_TYPE(klass) == T_ICLASS)
27
- // klass = RBASIC(klass)->klass;
28
-
29
- if (FL_TEST(klass, FL_SINGLETON) && (BUILTIN_TYPE(frame->self) == T_CLASS || BUILTIN_TYPE(frame->self) == T_MODULE))
30
- result[depth++] = (void*) frame->self;
31
- else
32
- result[depth++] = 0;
33
-
34
- result[depth++] = (void*) klass;
35
- result[depth++] = (void*) frame->last_func;
51
+ save_frame(frame, result, &depth);
36
52
  }
37
53
 
38
54
  for (; frame && (n = frame->node); frame = frame->prev) {
@@ -41,19 +57,10 @@ rb_stack_trace(void** result, int max_depth)
41
57
  if (frame->prev->last_func == frame->last_func) continue;
42
58
  }
43
59
 
44
- if (depth+3 > max_depth) break;
45
-
46
- VALUE klass = frame->prev->last_class;
47
- // if (BUILTIN_TYPE(klass) == T_ICLASS)
48
- // klass = RBASIC(klass)->klass;
49
-
50
- if (FL_TEST(klass, FL_SINGLETON) && (BUILTIN_TYPE(frame->prev->self) == T_CLASS || BUILTIN_TYPE(frame->prev->self) == T_MODULE))
51
- result[depth++] = (void*) frame->prev->self;
52
- else
53
- result[depth++] = 0;
60
+ if (depth+3 > max_depth)
61
+ break;
54
62
 
55
- result[depth++] = (void*) klass;
56
- result[depth++] = (void*) frame->prev->last_func;
63
+ save_frame(frame->prev, result, &depth);
57
64
  }
58
65
  }
59
66
 
@@ -107,6 +114,7 @@ Init_perftools()
107
114
  cPerfTools = rb_define_class("PerfTools", rb_cObject);
108
115
  cCpuProfiler = rb_define_class_under(cPerfTools, "CpuProfiler", rb_cObject);
109
116
  bProfilerRunning = Qfalse;
117
+ Iallocate = rb_intern("allocate");
110
118
 
111
119
  rb_define_singleton_method(cCpuProfiler, "running?", cpuprofiler_running_p, 0);
112
120
  rb_define_singleton_method(cCpuProfiler, "start", cpuprofiler_start, 1);
@@ -1,7 +1,7 @@
1
1
  spec = Gem::Specification.new do |s|
2
2
  s.name = 'perftools.rb'
3
- s.version = '0.1.4'
4
- s.date = '2009-06-01'
3
+ s.version = '0.1.5'
4
+ s.date = '2009-06-02'
5
5
  s.summary = 'google-perftools for ruby code'
6
6
  s.description = 'A sampling profiler for ruby code based on patches to google-perftools'
7
7
 
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: tmm1-perftools.rb
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.1.4
4
+ version: 0.1.5
5
5
  platform: ruby
6
6
  authors:
7
7
  - Aman Gupta
@@ -9,7 +9,7 @@ autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
11
 
12
- date: 2009-06-01 00:00:00 -07:00
12
+ date: 2009-06-02 00:00:00 -07:00
13
13
  default_executable:
14
14
  dependencies: []
15
15