ruby-static-tracing 0.0.13 → 0.0.14
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.
- 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
|