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.
- checksums.yaml +4 -4
- data/ext/ruby-static-tracing/darwin/provider.c +40 -52
- data/ext/ruby-static-tracing/darwin/provider.h +2 -3
- data/ext/ruby-static-tracing/darwin/ruby_static_tracing.c +4 -5
- data/ext/ruby-static-tracing/darwin/tracepoint.c +66 -91
- data/ext/ruby-static-tracing/darwin/tracepoint.h +4 -4
- data/ext/ruby-static-tracing/extconf.rb +40 -36
- data/ext/ruby-static-tracing/include/ruby_static_tracing.h +2 -1
- data/ext/ruby-static-tracing/lib/deps-extconf.rb +30 -28
- data/ext/ruby-static-tracing/lib/post-extconf.rb +23 -21
- data/ext/ruby-static-tracing/linux/provider.c +87 -61
- data/ext/ruby-static-tracing/linux/provider.h +16 -4
- data/ext/ruby-static-tracing/linux/ruby_static_tracing.c +7 -7
- data/ext/ruby-static-tracing/linux/tracepoint.c +86 -96
- data/ext/ruby-static-tracing/linux/tracepoint.h +2 -2
- data/ext/ruby-static-tracing/linux/types.h +2 -2
- data/lib/ruby-static-tracing.rb +11 -3
- data/lib/ruby-static-tracing/configuration.rb +11 -0
- data/lib/ruby-static-tracing/platform.rb +5 -1
- data/lib/ruby-static-tracing/provider.rb +50 -26
- data/lib/ruby-static-tracing/tracepoint.rb +19 -9
- data/lib/ruby-static-tracing/tracepoints.rb +2 -0
- data/lib/ruby-static-tracing/tracer/base.rb +2 -0
- data/lib/ruby-static-tracing/tracer/concerns/latency_tracer.rb +2 -0
- data/lib/ruby-static-tracing/tracer/helpers.rb +8 -8
- data/lib/ruby-static-tracing/tracer/latency.rb +1 -1
- data/lib/ruby-static-tracing/tracer/stack.rb +4 -2
- data/lib/ruby-static-tracing/tracers.rb +9 -0
- data/lib/ruby-static-tracing/version.rb +2 -1
- 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
|
-
|
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, "
|
40
|
-
rb_define_method(cProvider, "
|
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,
|
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
|
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 =
|
37
|
-
|
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,
|
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
|
-
|
57
|
-
|
58
|
-
|
59
|
-
|
60
|
-
|
61
|
-
|
62
|
-
|
63
|
-
|
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,
|
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
|
-
|
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
|
-
|
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
|
-
|
129
|
-
const char*
|
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
|
-
|
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
|
-
|
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
|
-
|
168
|
-
|
169
|
-
|
170
|
-
|
171
|
-
|
172
|
-
|
173
|
-
|
174
|
-
|
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,
|
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
|
-
|
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
|
-
|
219
|
-
|
220
|
-
|
221
|
-
|
222
|
-
|
223
|
-
|
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 *
|
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,
|
8
|
-
String
|
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
|
data/lib/ruby-static-tracing.rb
CHANGED
@@ -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
|