ruby-static-tracing 0.0.13 → 0.0.14

Sign up to get free protection for your applications and to get access to all the features.
Files changed (30) hide show
  1. checksums.yaml +4 -4
  2. data/ext/ruby-static-tracing/darwin/provider.c +40 -52
  3. data/ext/ruby-static-tracing/darwin/provider.h +2 -3
  4. data/ext/ruby-static-tracing/darwin/ruby_static_tracing.c +4 -5
  5. data/ext/ruby-static-tracing/darwin/tracepoint.c +66 -91
  6. data/ext/ruby-static-tracing/darwin/tracepoint.h +4 -4
  7. data/ext/ruby-static-tracing/extconf.rb +40 -36
  8. data/ext/ruby-static-tracing/include/ruby_static_tracing.h +2 -1
  9. data/ext/ruby-static-tracing/lib/deps-extconf.rb +30 -28
  10. data/ext/ruby-static-tracing/lib/post-extconf.rb +23 -21
  11. data/ext/ruby-static-tracing/linux/provider.c +87 -61
  12. data/ext/ruby-static-tracing/linux/provider.h +16 -4
  13. data/ext/ruby-static-tracing/linux/ruby_static_tracing.c +7 -7
  14. data/ext/ruby-static-tracing/linux/tracepoint.c +86 -96
  15. data/ext/ruby-static-tracing/linux/tracepoint.h +2 -2
  16. data/ext/ruby-static-tracing/linux/types.h +2 -2
  17. data/lib/ruby-static-tracing.rb +11 -3
  18. data/lib/ruby-static-tracing/configuration.rb +11 -0
  19. data/lib/ruby-static-tracing/platform.rb +5 -1
  20. data/lib/ruby-static-tracing/provider.rb +50 -26
  21. data/lib/ruby-static-tracing/tracepoint.rb +19 -9
  22. data/lib/ruby-static-tracing/tracepoints.rb +2 -0
  23. data/lib/ruby-static-tracing/tracer/base.rb +2 -0
  24. data/lib/ruby-static-tracing/tracer/concerns/latency_tracer.rb +2 -0
  25. data/lib/ruby-static-tracing/tracer/helpers.rb +8 -8
  26. data/lib/ruby-static-tracing/tracer/latency.rb +1 -1
  27. data/lib/ruby-static-tracing/tracer/stack.rb +4 -2
  28. data/lib/ruby-static-tracing/tracers.rb +9 -0
  29. data/lib/ruby-static-tracing/version.rb +2 -1
  30. metadata +42 -14
@@ -4,8 +4,8 @@
4
4
  // Include libstapsdt.h to wrap
5
5
  #include <libstapsdt.h> // FIXME use local
6
6
 
7
- #include "types.h"
8
7
  #include "ruby_static_tracing.h"
8
+ #include "types.h"
9
9
 
10
10
  typedef struct {
11
11
  char *name;
@@ -54,11 +54,23 @@ provider_disable(VALUE self);
54
54
  VALUE
55
55
  provider_destroy(VALUE self);
56
56
 
57
+ /*
58
+ * call-seq:
59
+ * provider.path() -> string
60
+ *
61
+ * Get a path to this provider, if the platform supports it
62
+ *
63
+ * Returns string for path, or empty string if failed
64
+ */
65
+ VALUE
66
+ provider_path(VALUE self);
67
+
57
68
  // Allocate a static_tracing_provider_type struct for ruby memory management
58
69
  VALUE
59
70
  static_tracing_provider_alloc(VALUE klass);
60
71
 
61
- SDTProbe_t
62
- *provider_add_tracepoint_internal(VALUE self, const char* name, int argc, Tracepoint_arg_types *args);
72
+ SDTProbe_t *provider_add_tracepoint_internal(VALUE self, const char *name,
73
+ int argc,
74
+ Tracepoint_arg_types *args);
63
75
 
64
- #endif //STATIC_TRACING_PROVIDER_H
76
+ #endif // STATIC_TRACING_PROVIDER_H
@@ -2,8 +2,7 @@
2
2
 
3
3
  VALUE eUSDT, eInternal;
4
4
 
5
- void Init_ruby_static_tracing()
6
- {
5
+ void Init_ruby_static_tracing() {
7
6
  VALUE cStaticTracing, cProvider, cTracepoint;
8
7
 
9
8
  cStaticTracing = rb_const_get(rb_cObject, rb_intern("StaticTracing"));
@@ -15,7 +14,7 @@ void Init_ruby_static_tracing()
15
14
  */
16
15
  cProvider = rb_const_get(cStaticTracing, rb_intern("Provider"));
17
16
 
18
- /*
17
+ /*
19
18
  * Document-class: Statictracing::Tracepoint
20
19
  *
21
20
  * A Tracepoint is a wrapper around an SDTProbe
@@ -36,13 +35,14 @@ void Init_ruby_static_tracing()
36
35
 
37
36
  rb_define_alloc_func(cProvider, static_tracing_provider_alloc);
38
37
  rb_define_method(cProvider, "provider_initialize", provider_initialize, 1);
39
- rb_define_method(cProvider, "enable", provider_enable, 0);
40
- rb_define_method(cProvider, "disable", provider_disable, 0);
38
+ rb_define_method(cProvider, "_enable_provider", provider_enable, 0);
39
+ rb_define_method(cProvider, "_disable_provider", provider_disable, 0);
41
40
  rb_define_method(cProvider, "destroy", provider_destroy, 0);
41
+ rb_define_method(cProvider, "path", provider_path, 0);
42
42
 
43
43
  rb_define_alloc_func(cTracepoint, static_tracing_tracepoint_alloc);
44
- rb_define_method(cTracepoint, "tracepoint_initialize", tracepoint_initialize, 3);
44
+ rb_define_method(cTracepoint, "tracepoint_initialize", tracepoint_initialize,
45
+ 3);
45
46
  rb_define_method(cTracepoint, "_fire_tracepoint", tracepoint_fire, 1);
46
47
  rb_define_method(cTracepoint, "enabled?", tracepoint_enabled, 0);
47
48
  }
48
-
@@ -1,29 +1,23 @@
1
1
  #include "tracepoint.h"
2
2
 
3
- static const rb_data_type_t
4
- static_tracing_tracepoint_type;
3
+ static const rb_data_type_t static_tracing_tracepoint_type;
5
4
 
6
- static const char*
7
- check_name_arg(VALUE provider);
5
+ static const char *check_name_arg(VALUE provider);
8
6
 
9
- static const char*
10
- check_provider_arg(VALUE provider);
7
+ static const char *check_provider_arg(VALUE provider);
11
8
 
12
- static Tracepoint_arg_types
13
- *check_vargs(int *argc, VALUE vargs);
9
+ static Tracepoint_arg_types *check_vargs(int *argc, VALUE vargs);
14
10
 
15
- static Tracepoint_fire_arg
16
- *check_fire_args(int *argc, VALUE vargs);
11
+ static Tracepoint_fire_arg *check_fire_args(int *argc, VALUE vargs);
17
12
 
18
13
  VALUE
19
- tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
20
- {
14
+ tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs) {
21
15
  VALUE cStaticTracing, cProvider, cProviderInst;
22
16
  static_tracing_tracepoint_t *tracepoint = NULL;
23
17
  const char *c_name_str = NULL;
24
18
  int argc = 0;
25
19
 
26
- c_name_str = check_name_arg(name);
20
+ c_name_str = check_name_arg(name);
27
21
  check_provider_arg(provider); // FIXME should only accept string
28
22
  Tracepoint_arg_types *args = check_vargs(&argc, vargs);
29
23
 
@@ -33,8 +27,10 @@ tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
33
27
  cProviderInst = rb_funcall(cProvider, rb_intern("register"), 1, provider);
34
28
 
35
29
  // Use the provider to register a tracepoint
36
- SDTProbe_t *probe = provider_add_tracepoint_internal(cProviderInst, c_name_str, argc, args);
37
- TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, tracepoint);
30
+ SDTProbe_t *probe =
31
+ provider_add_tracepoint_internal(cProviderInst, c_name_str, argc, args);
32
+ TypedData_Get_Struct(self, static_tracing_tracepoint_t,
33
+ &static_tracing_tracepoint_type, tracepoint);
38
34
 
39
35
  // Stare the tracepoint handle in our struct
40
36
  tracepoint->sdt_tracepoint = probe;
@@ -44,39 +40,53 @@ tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
44
40
  }
45
41
 
46
42
  VALUE
47
- tracepoint_fire(VALUE self, VALUE vargs)
48
- {
43
+ tracepoint_fire(VALUE self, VALUE vargs) {
49
44
  static_tracing_tracepoint_t *res = NULL;
50
- TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
45
+ TypedData_Get_Struct(self, static_tracing_tracepoint_t,
46
+ &static_tracing_tracepoint_type, res);
51
47
  int argc = 0;
52
48
 
53
49
  Tracepoint_fire_arg *args = check_fire_args(&argc, vargs);
54
- switch(argc)
55
- {
56
- case 0: probeFire(res->sdt_tracepoint); break;
57
- case 1: probeFire(res->sdt_tracepoint, args[0]); break;
58
- case 2: probeFire(res->sdt_tracepoint, args[0], args[1]); break;
59
- case 3: probeFire(res->sdt_tracepoint, args[0], args[1], args[2]); break;
60
- case 4: probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3]); break;
61
- case 5: probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4]); break;
62
- case 6: probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4], args[5]); break;
63
- default: probeFire(res->sdt_tracepoint); break;
50
+ switch (argc) {
51
+ case 0:
52
+ probeFire(res->sdt_tracepoint);
53
+ break;
54
+ case 1:
55
+ probeFire(res->sdt_tracepoint, args[0]);
56
+ break;
57
+ case 2:
58
+ probeFire(res->sdt_tracepoint, args[0], args[1]);
59
+ break;
60
+ case 3:
61
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2]);
62
+ break;
63
+ case 4:
64
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3]);
65
+ break;
66
+ case 5:
67
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4]);
68
+ break;
69
+ case 6:
70
+ probeFire(res->sdt_tracepoint, args[0], args[1], args[2], args[3], args[4],
71
+ args[5]);
72
+ break;
73
+ default:
74
+ probeFire(res->sdt_tracepoint);
75
+ break;
64
76
  }
65
77
 
66
78
  return Qnil;
67
79
  }
68
80
 
69
81
  VALUE
70
- tracepoint_enabled(VALUE self)
71
- {
82
+ tracepoint_enabled(VALUE self) {
72
83
  static_tracing_tracepoint_t *res = NULL;
73
- TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
84
+ TypedData_Get_Struct(self, static_tracing_tracepoint_t,
85
+ &static_tracing_tracepoint_type, res);
74
86
  return probeIsEnabled(res->sdt_tracepoint) == 1 ? Qtrue : Qfalse;
75
87
  }
76
88
 
77
- static const char*
78
- check_name_arg(VALUE name)
79
- {
89
+ static const char *check_name_arg(VALUE name) {
80
90
  const char *c_name_str = NULL;
81
91
 
82
92
  if (TYPE(name) != T_SYMBOL && TYPE(name) != T_STRING) {
@@ -91,9 +101,7 @@ check_name_arg(VALUE name)
91
101
  return c_name_str;
92
102
  }
93
103
 
94
- static const char*
95
- check_provider_arg(VALUE provider)
96
- {
104
+ static const char *check_provider_arg(VALUE provider) {
97
105
  const char *c_provider_str = NULL;
98
106
 
99
107
  if (TYPE(provider) != T_SYMBOL && TYPE(provider) != T_STRING) {
@@ -108,25 +116,22 @@ check_provider_arg(VALUE provider)
108
116
  return c_provider_str;
109
117
  }
110
118
 
111
- static Tracepoint_arg_types
112
- *check_vargs(int *argc, VALUE vargs)
113
- {
114
- if(TYPE(vargs) == T_ARRAY)
115
- {
119
+ static Tracepoint_arg_types *check_vargs(int *argc, VALUE vargs) {
120
+ if (TYPE(vargs) == T_ARRAY) {
116
121
  VALUE rLength = rb_funcall(vargs, rb_intern("length"), 0, Qnil);
117
122
  *argc = NUM2INT(rLength);
118
123
 
119
- if(*argc > 6)
120
- {
121
- printf("ERROR - passed %i args, maximum 6 argument types can be passed", *argc);
124
+ if (*argc > 6) {
125
+ printf("ERROR - passed %i args, maximum 6 argument types can be passed",
126
+ *argc);
122
127
  return NULL;
123
128
  }
124
129
  int i;
125
130
  Tracepoint_arg_types *args = malloc(*argc * sizeof(Tracepoint_arg_types));
126
- for (i = 0; i < *argc; i++)
127
- {
128
- VALUE str = rb_funcall(rb_ary_entry(vargs, i), rb_intern("to_s"), 0, Qnil);
129
- const char* cStr = RSTRING_PTR(str);
131
+ for (i = 0; i < *argc; i++) {
132
+ VALUE str =
133
+ rb_funcall(rb_ary_entry(vargs, i), rb_intern("to_s"), 0, Qnil);
134
+ const char *cStr = RSTRING_PTR(str);
130
135
  if (strcmp(cStr, "Integer")) {
131
136
  args[i] = Integer;
132
137
  } else if (strcmp(cStr, "String")) {
@@ -142,37 +147,32 @@ static Tracepoint_arg_types
142
147
  }
143
148
  }
144
149
 
145
- static Tracepoint_fire_arg
146
- *check_fire_args(int *argc, VALUE vargs)
147
- {
148
- if(TYPE(vargs) == T_ARRAY)
149
- {
150
+ static Tracepoint_fire_arg *check_fire_args(int *argc, VALUE vargs) {
151
+ if (TYPE(vargs) == T_ARRAY) {
150
152
  VALUE rLength = rb_funcall(vargs, rb_intern("length"), 0, Qnil);
151
153
  *argc = NUM2INT(rLength);
152
154
 
153
- if(*argc > 6)
154
- {
155
- printf("ERROR - passed %i args, maximum 6 argument types can be passed", *argc);
155
+ if (*argc > 6) {
156
+ printf("ERROR - passed %i args, maximum 6 argument types can be passed",
157
+ *argc);
156
158
  return NULL;
157
159
  }
158
160
 
159
161
  Tracepoint_fire_arg *args = malloc(*argc * sizeof(Tracepoint_fire_arg));
160
- //printf("SIZE: %i ARGC: %i \n", sizeof(Tracepoint_fire_arg), *argc);
162
+ // printf("SIZE: %i ARGC: %i \n", sizeof(Tracepoint_fire_arg), *argc);
161
163
  int i;
162
- for (i = 0; i < *argc; i++)
163
- {
164
+ for (i = 0; i < *argc; i++) {
164
165
  VALUE val = rb_ary_entry(vargs, i);
165
- switch(TYPE(val))
166
- {
167
- case T_FIXNUM:
168
- args[i].intval = FIX2LONG(val);
169
- break;
170
- case T_STRING:
171
- args[i].strval = RSTRING_PTR(val);
172
- break;
173
- default:
174
- printf("ERROR unsupported type passed for argument %i to fire\n", i);
175
- break;
166
+ switch (TYPE(val)) {
167
+ case T_FIXNUM:
168
+ args[i].intval = FIX2LONG(val);
169
+ break;
170
+ case T_STRING:
171
+ args[i].strval = RSTRING_PTR(val);
172
+ break;
173
+ default:
174
+ printf("ERROR unsupported type passed for argument %i to fire\n", i);
175
+ break;
176
176
  }
177
177
  }
178
178
  return args;
@@ -184,43 +184,33 @@ static Tracepoint_fire_arg
184
184
 
185
185
  // Allocate a static_tracing_tracepoint_type struct for ruby memory management
186
186
  VALUE
187
- static_tracing_tracepoint_alloc(VALUE klass)
188
- {
187
+ static_tracing_tracepoint_alloc(VALUE klass) {
189
188
  static_tracing_tracepoint_t *res;
190
- VALUE obj = TypedData_Make_Struct(klass, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
189
+ VALUE obj = TypedData_Make_Struct(klass, static_tracing_tracepoint_t,
190
+ &static_tracing_tracepoint_type, res);
191
191
  return obj;
192
192
  }
193
193
 
194
- static inline void
195
- static_tracing_tracepoint_mark(void *ptr)
196
- {
197
- /* noop */
194
+ static inline void static_tracing_tracepoint_mark(void *ptr) { /* noop */
198
195
  }
199
196
 
200
- static inline void
201
- static_tracing_tracepoint_free(void *ptr)
202
- {
203
- static_tracing_tracepoint_t *res = (static_tracing_tracepoint_t *) ptr;
204
- //if (res->name) {
197
+ static inline void static_tracing_tracepoint_free(void *ptr) {
198
+ static_tracing_tracepoint_t *res = (static_tracing_tracepoint_t *)ptr;
199
+ // if (res->name) {
205
200
  // free(res->name);
206
201
  // res->name = NULL;
207
202
  //}
208
203
  xfree(res);
209
204
  }
210
205
 
211
- static inline size_t
212
- static_tracing_tracepoint_memsize(const void *ptr)
213
- {
206
+ static inline size_t static_tracing_tracepoint_memsize(const void *ptr) {
214
207
  return sizeof(static_tracing_provider_t);
215
208
  }
216
209
 
217
- static const rb_data_type_t
218
- static_tracing_tracepoint_type = {
219
- "static_tracing_tracepoint",
220
- {
221
- static_tracing_tracepoint_mark,
222
- static_tracing_tracepoint_free,
223
- static_tracing_tracepoint_memsize
224
- },
225
- NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
226
- };
210
+ static const rb_data_type_t static_tracing_tracepoint_type = {
211
+ "static_tracing_tracepoint",
212
+ {static_tracing_tracepoint_mark, static_tracing_tracepoint_free,
213
+ static_tracing_tracepoint_memsize},
214
+ NULL,
215
+ NULL,
216
+ RUBY_TYPED_FREE_IMMEDIATELY};
@@ -10,7 +10,7 @@
10
10
 
11
11
  typedef union {
12
12
  unsigned long long intval;
13
- char * strval;
13
+ char *strval;
14
14
  } Tracepoint_fire_arg;
15
15
 
16
16
  typedef struct {
@@ -50,4 +50,4 @@ tracepoint_enabled(VALUE self);
50
50
  VALUE
51
51
  static_tracing_tracepoint_alloc(VALUE klass);
52
52
 
53
- #endif //STATIC_TRACING_TRACEPOINT_H
53
+ #endif // STATIC_TRACING_TRACEPOINT_H
@@ -4,8 +4,8 @@
4
4
  #include <libstapsdt.h>
5
5
 
6
6
  typedef enum TRACEPOINT_ARG_TYPES_ENUM {
7
- Integer = int64, // STAP enum type -8
8
- String = uint64, // STAP enum type 8
7
+ Integer = int64, // STAP enum type -8
8
+ String = uint64, // STAP enum type 8
9
9
  } Tracepoint_arg_types;
10
10
 
11
11
  #endif // STATIC_TRACING_TYPEs_H
@@ -11,7 +11,7 @@ require 'ruby-static-tracing/configuration'
11
11
  require 'ruby-static-tracing/tracer'
12
12
  require 'ruby-static-tracing/tracers'
13
13
 
14
- # FIXME Including StaticTracing should cause every method in a module or class to be registered
14
+ # FIXME: Including StaticTracing should cause every method in a module or class to be registered
15
15
  # Implement this by introspecting all methods on the includor, and wrapping them.
16
16
  module StaticTracing
17
17
  extend self
@@ -24,8 +24,10 @@ module StaticTracing
24
24
 
25
25
  self.logger = Logger.new(STDERR)
26
26
 
27
+ # This will print a message indicating that tracepoints are disabled on this platform
27
28
  def issue_disabled_tracepoints_warning
28
29
  return if defined?(@warning_issued)
30
+
29
31
  @warning_issued = true
30
32
  logger.info("USDT tracepoints are not presently supported supported on #{RUBY_PLATFORM} - all operations will no-op")
31
33
  end
@@ -47,7 +49,7 @@ module StaticTracing
47
49
  # with a wrapped version that has tracing enabled
48
50
  def enable!
49
51
  StaticTracing::Tracers.enable!
50
- StaticTracing::Provider.enable!
52
+ StaticTracing::Provider.enable! # FIXME individually call enable
51
53
  @enabled = true
52
54
  end
53
55
 
@@ -55,14 +57,20 @@ module StaticTracing
55
57
  # no longer wrapping them
56
58
  def disable!
57
59
  StaticTracing::Tracers.disable!
58
- StaticTracing::Provider.disable!
60
+ StaticTracing::Provider.disable! # FIXME dangerous
59
61
  @enabled = false
60
62
  end
61
63
 
64
+ # Toggles between enabling and disabling tracepoints declared through tracers
62
65
  def toggle_tracing!
63
66
  enabled? ? disable! : enable!
64
67
  end
65
68
 
69
+ # Block to configure static tracing, eg:
70
+ #
71
+ # StaticTracing.configure do |config|
72
+ # config.add_tracer(StaticTracing::Tracer::Latency)
73
+ # end
66
74
  def configure
67
75
  yield Configuration.instance
68
76
  end
@@ -2,6 +2,7 @@
2
2
 
3
3
  module StaticTracing
4
4
  class Configuration
5
+ # Modes of operation for tracers
5
6
  module Modes
6
7
  ON = 'ON'
7
8
  OFF = 'OFF'
@@ -20,34 +21,42 @@ module StaticTracing
20
21
 
21
22
  attr_reader :mode, :signal
22
23
 
24
+ # A new configuration instance
23
25
  def initialize
24
26
  @mode = Modes::SIGNAL
25
27
  @signal = Modes::SIGNALS::SIGPROF
26
28
  enable_trap
27
29
  end
28
30
 
31
+ # Sets the mode [ON, OFF, SIGNAL]
32
+ # Default is SIGNAL
29
33
  def mode=(new_mode)
30
34
  handle_old_mode
31
35
  @mode = new_mode
32
36
  handle_new_mode
33
37
  end
34
38
 
39
+ # Sets the SIGNAL to listen to,
40
+ # Default is SIGPROF
35
41
  def signal=(new_signal)
36
42
  disable_trap
37
43
  @signal = new_signal
38
44
  enable_trap
39
45
  end
40
46
 
47
+ # Adds a new tracer globally
41
48
  def add_tracer(tracer)
42
49
  Tracers.add(tracer)
43
50
  end
44
51
 
45
52
  private
46
53
 
54
+ # Clean up trap handlers if mode changed to not need it
47
55
  def handle_old_mode
48
56
  disable_trap if @mode == Modes::SIGNAL
49
57
  end
50
58
 
59
+ # Enable trap handlers if needed
51
60
  def handle_new_mode
52
61
  if @mode == Modes::SIGNAL
53
62
  enable_trap
@@ -58,10 +67,12 @@ module StaticTracing
58
67
  end
59
68
  end
60
69
 
70
+ # Disables trap handler
61
71
  def disable_trap
62
72
  Signal.trap(@signal, 'DEFAULT')
63
73
  end
64
74
 
75
+ # Enables a new trap handler
65
76
  def enable_trap
66
77
  Signal.trap(@signal) { StaticTracing.toggle_tracing! }
67
78
  end