ruby-static-tracing 0.0.2 → 0.0.3
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 +5 -5
- data/ext/ruby-static-tracing/darwin/provider.c +128 -0
- data/ext/ruby-static-tracing/darwin/provider.h +62 -0
- data/ext/ruby-static-tracing/darwin/ruby_static_tracing.c +48 -0
- data/ext/ruby-static-tracing/darwin/tracepoint.c +231 -0
- data/ext/ruby-static-tracing/darwin/tracepoint.h +52 -0
- data/ext/ruby-static-tracing/extconf.rb +45 -5
- data/ext/ruby-static-tracing/{linux → include}/ruby_static_tracing.h +3 -6
- data/ext/ruby-static-tracing/lib/deps-extconf.rb +47 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/example/demo.c +42 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.c +41 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/dynamic-symbols.h +34 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/errors.c +30 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/errors.h +8 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.c +27 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/hash-table.h +3 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.c +208 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/libstapsdt.h +66 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.c +176 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/sdtnote.h +46 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/section.c +30 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/section.h +21 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.c +563 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/shared-lib.h +46 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/string-table.c +67 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/string-table.h +28 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/util.c +12 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/src/util.h +6 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/tests/test-errors.c +77 -0
- data/ext/ruby-static-tracing/lib/libstapsdt/tests/test-memory-leaks.c +25 -0
- data/ext/ruby-static-tracing/lib/post-extconf.rb +37 -0
- data/ext/ruby-static-tracing/linux/provider.c +1 -1
- data/ext/ruby-static-tracing/linux/provider.h +2 -7
- data/ext/ruby-static-tracing/linux/ruby_static_tracing.c +4 -3
- data/ext/ruby-static-tracing/linux/tracepoint.c +0 -1
- data/ext/ruby-static-tracing/linux/tracepoint.h +1 -5
- data/ext/ruby-static-tracing/linux/types.h +11 -0
- data/lib/ruby-static-tracing.rb +5 -7
- data/lib/ruby-static-tracing/platform.rb +48 -0
- data/lib/ruby-static-tracing/provider.rb +18 -1
- data/lib/ruby-static-tracing/tracepoint.rb +15 -3
- data/lib/ruby-static-tracing/tracepoints.rb +36 -0
- data/lib/ruby-static-tracing/tracers.rb +1 -0
- data/lib/ruby-static-tracing/tracers/base.rb +68 -0
- data/lib/ruby-static-tracing/tracers/helpers.rb +17 -0
- data/lib/ruby-static-tracing/tracers/latency_tracer.rb +13 -60
- data/lib/ruby-static-tracing/tracers/stack_tracer.rb +19 -0
- data/lib/ruby-static-tracing/version.rb +1 -1
- metadata +41 -5
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
|
-
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
2
|
+
SHA256:
|
3
|
+
metadata.gz: f901c3dd17e5873073d011db778b9ef22983fa9c6225be6b90abc226e223d1ff
|
4
|
+
data.tar.gz: 525513e06cc54471b1f2c09f3c8d82e4ba47fac56b89e3d68a80ac8747dd4d3f
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 987a3b0391cdbf22db11795cf5d53f5ebe8d71bf9962969a73fbf952dd455ff4656c3b4ca88dc01d8418b4278f84f83a10b8943be7aaf0da1a0329b861aa2015
|
7
|
+
data.tar.gz: f14b0d94b0bfce0ea110a379cb1954a51c498fd5b4370ecc7bbee5fecf40c11a66bf725a28a79e690a1a7119f3d5d31ac9691e2c83ecaa17391003383328c3e9
|
@@ -0,0 +1,128 @@
|
|
1
|
+
#include "provider.h"
|
2
|
+
|
3
|
+
static const rb_data_type_t
|
4
|
+
static_tracing_provider_type;
|
5
|
+
|
6
|
+
// Forward decls
|
7
|
+
static const char*
|
8
|
+
check_name_arg(VALUE name);
|
9
|
+
|
10
|
+
/*
|
11
|
+
Wraps usdt_create_provider from libusdt.h
|
12
|
+
*/
|
13
|
+
VALUE
|
14
|
+
provider_initialize(VALUE self, VALUE name)
|
15
|
+
{
|
16
|
+
const char *c_name_str = NULL;
|
17
|
+
static_tracing_provider_t *res = NULL;
|
18
|
+
|
19
|
+
c_name_str = check_name_arg(name);
|
20
|
+
|
21
|
+
TypedData_Get_Struct(self, static_tracing_provider_t, &static_tracing_provider_type, res);
|
22
|
+
res->usdt_provider = usdt_create_provider(c_name_str, c_name_str); // FIXME make module from name and just prepend "_module_"
|
23
|
+
return self;
|
24
|
+
}
|
25
|
+
|
26
|
+
// // Internal function used to register a tracepoint against a provider instance
|
27
|
+
int
|
28
|
+
provider_add_tracepoint_internal(VALUE self, usdt_probedef_t *probedef)
|
29
|
+
{
|
30
|
+
static_tracing_provider_t *res = NULL;
|
31
|
+
TypedData_Get_Struct(self, static_tracing_provider_t, &static_tracing_provider_type, res);
|
32
|
+
return usdt_provider_add_probe(res->usdt_provider, probedef) == 0 ? Qtrue : Qfalse;
|
33
|
+
}
|
34
|
+
|
35
|
+
/*
|
36
|
+
Wraps usdt_provider_enable from libusdt.h
|
37
|
+
*/
|
38
|
+
VALUE
|
39
|
+
provider_enable(VALUE self)
|
40
|
+
{
|
41
|
+
static_tracing_provider_t *res = NULL;
|
42
|
+
TypedData_Get_Struct(self, static_tracing_provider_t, &static_tracing_provider_type, res);
|
43
|
+
return usdt_provider_enable(res->usdt_provider) == 0 ? Qtrue : Qfalse;
|
44
|
+
}
|
45
|
+
|
46
|
+
/*
|
47
|
+
Wraps usdt_provider_disable from libusdt.h
|
48
|
+
*/
|
49
|
+
VALUE
|
50
|
+
provider_disable(VALUE self)
|
51
|
+
{
|
52
|
+
static_tracing_provider_t *res = NULL;
|
53
|
+
TypedData_Get_Struct(self, static_tracing_provider_t, &static_tracing_provider_type, res);
|
54
|
+
return usdt_provider_disable(res->usdt_provider) == 0 ? Qtrue : Qfalse;
|
55
|
+
}
|
56
|
+
|
57
|
+
/*
|
58
|
+
Wraps usdt_provider_free from libusdt.h
|
59
|
+
*/
|
60
|
+
VALUE
|
61
|
+
provider_destroy(VALUE self)
|
62
|
+
{
|
63
|
+
static_tracing_provider_t *res = NULL;
|
64
|
+
TypedData_Get_Struct(self, static_tracing_provider_t, &static_tracing_provider_type, res);
|
65
|
+
usdt_provider_free(res->usdt_provider);
|
66
|
+
return Qnil;
|
67
|
+
}
|
68
|
+
|
69
|
+
// Allocate a static_tracing_provider_type struct for ruby memory management
|
70
|
+
VALUE
|
71
|
+
static_tracing_provider_alloc(VALUE klass)
|
72
|
+
{
|
73
|
+
static_tracing_provider_t *res;
|
74
|
+
VALUE obj = TypedData_Make_Struct(klass, static_tracing_provider_t, &static_tracing_provider_type, res);
|
75
|
+
return obj;
|
76
|
+
}
|
77
|
+
|
78
|
+
|
79
|
+
static const char*
|
80
|
+
check_name_arg(VALUE name)
|
81
|
+
{
|
82
|
+
const char *c_name_str = NULL;
|
83
|
+
|
84
|
+
if (TYPE(name) != T_SYMBOL && TYPE(name) != T_STRING) {
|
85
|
+
rb_raise(rb_eTypeError, "name must be a symbol or string");
|
86
|
+
}
|
87
|
+
if (TYPE(name) == T_SYMBOL) {
|
88
|
+
c_name_str = rb_id2name(rb_to_id(name));
|
89
|
+
} else if (TYPE(name) == T_STRING) {
|
90
|
+
c_name_str = RSTRING_PTR(name);
|
91
|
+
}
|
92
|
+
|
93
|
+
return c_name_str;
|
94
|
+
}
|
95
|
+
|
96
|
+
static inline void
|
97
|
+
static_tracing_provider_mark(void *ptr)
|
98
|
+
{
|
99
|
+
/* noop */
|
100
|
+
}
|
101
|
+
|
102
|
+
static inline void
|
103
|
+
static_tracing_provider_free(void *ptr)
|
104
|
+
{
|
105
|
+
static_tracing_provider_t *res = (static_tracing_provider_t *) ptr;
|
106
|
+
//if (res->name) {
|
107
|
+
// free(res->name);
|
108
|
+
// res->name = NULL;
|
109
|
+
//}
|
110
|
+
xfree(res);
|
111
|
+
}
|
112
|
+
|
113
|
+
static inline size_t
|
114
|
+
static_tracing_provider_memsize(const void *ptr)
|
115
|
+
{
|
116
|
+
return sizeof(static_tracing_provider_t);
|
117
|
+
}
|
118
|
+
|
119
|
+
static const rb_data_type_t
|
120
|
+
static_tracing_provider_type = {
|
121
|
+
"static_tracing_provider",
|
122
|
+
{
|
123
|
+
static_tracing_provider_mark,
|
124
|
+
static_tracing_provider_free,
|
125
|
+
static_tracing_provider_memsize
|
126
|
+
},
|
127
|
+
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
128
|
+
};
|
@@ -0,0 +1,62 @@
|
|
1
|
+
#ifndef STATIC_TRACING_PROVIDER_H
|
2
|
+
#define STATIC_TRACING_PROVIDER_H
|
3
|
+
|
4
|
+
#include "usdt.h"
|
5
|
+
|
6
|
+
#include "ruby_static_tracing.h"
|
7
|
+
#include "tracepoint.h"
|
8
|
+
|
9
|
+
typedef struct {
|
10
|
+
char *name;
|
11
|
+
usdt_provider_t *usdt_provider;
|
12
|
+
} static_tracing_provider_t;
|
13
|
+
|
14
|
+
/*
|
15
|
+
* call-seq:
|
16
|
+
* StaticTracing::Provider.new(id) -> provider
|
17
|
+
*
|
18
|
+
* Creates a new Provider.
|
19
|
+
*/
|
20
|
+
VALUE
|
21
|
+
provider_initialize(VALUE self, VALUE id);
|
22
|
+
|
23
|
+
/*
|
24
|
+
* call-seq:
|
25
|
+
* provider.enable() -> true
|
26
|
+
*
|
27
|
+
* Enable this provider
|
28
|
+
*
|
29
|
+
* Return true if the enable operation succeeded
|
30
|
+
*/
|
31
|
+
VALUE
|
32
|
+
provider_enable(VALUE self);
|
33
|
+
|
34
|
+
/*
|
35
|
+
* call-seq:
|
36
|
+
* provider.disable() -> true
|
37
|
+
*
|
38
|
+
* Disable this provider
|
39
|
+
*
|
40
|
+
* Return true if the disable operation succeeded
|
41
|
+
*/
|
42
|
+
VALUE
|
43
|
+
provider_disable(VALUE self);
|
44
|
+
/*
|
45
|
+
* call-seq:
|
46
|
+
* provider.destroy() -> true
|
47
|
+
*
|
48
|
+
* Destroys this provider.
|
49
|
+
*
|
50
|
+
* Return true if the destory operation succeeded
|
51
|
+
*/
|
52
|
+
VALUE
|
53
|
+
provider_destroy(VALUE self);
|
54
|
+
|
55
|
+
// Allocate a static_tracing_provider_type struct for ruby memory management
|
56
|
+
VALUE
|
57
|
+
static_tracing_provider_alloc(VALUE klass);
|
58
|
+
|
59
|
+
int
|
60
|
+
provider_add_tracepoint_internal(VALUE self, usdt_probedef_t* probedef);
|
61
|
+
|
62
|
+
#endif //STATIC_TRACING_PROVIDER_H
|
@@ -0,0 +1,48 @@
|
|
1
|
+
#include "ruby_static_tracing.h"
|
2
|
+
|
3
|
+
VALUE eUSDT, eInternal;
|
4
|
+
|
5
|
+
void Init_ruby_static_tracing()
|
6
|
+
{
|
7
|
+
VALUE cStaticTracing, cProvider, cTracepoint;
|
8
|
+
|
9
|
+
cStaticTracing = rb_const_get(rb_cObject, rb_intern("StaticTracing"));
|
10
|
+
|
11
|
+
/*
|
12
|
+
* Document-class: StaticTracing::Provider
|
13
|
+
*
|
14
|
+
* Provider is the wrapper around libstapsdt
|
15
|
+
*/
|
16
|
+
cProvider = rb_const_get(cStaticTracing, rb_intern("Provider"));
|
17
|
+
|
18
|
+
/*
|
19
|
+
* Document-class: Statictracing::Tracepoint
|
20
|
+
*
|
21
|
+
* A Tracepoint is a wrapper around an SDTProbe
|
22
|
+
*/
|
23
|
+
cTracepoint = rb_const_get(cStaticTracing, rb_intern("Tracepoint"));
|
24
|
+
|
25
|
+
/* Document-class: StaticTracing::SyscallError
|
26
|
+
*
|
27
|
+
* Represents failures to fire a tracepoint or register a provider
|
28
|
+
*/
|
29
|
+
eUSDT = rb_const_get(cStaticTracing, rb_intern("USDTError"));
|
30
|
+
|
31
|
+
/* Document-class: StaticTracing::InternalError
|
32
|
+
*
|
33
|
+
* An internal StaticTracing error. These errors may constitute bugs.
|
34
|
+
*/
|
35
|
+
eInternal = rb_const_get(cStaticTracing, rb_intern("InternalError"));
|
36
|
+
|
37
|
+
rb_define_alloc_func(cProvider, static_tracing_provider_alloc);
|
38
|
+
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);
|
41
|
+
rb_define_method(cProvider, "destroy", provider_destroy, 0);
|
42
|
+
|
43
|
+
rb_define_alloc_func(cTracepoint, static_tracing_tracepoint_alloc);
|
44
|
+
rb_define_method(cTracepoint, "tracepoint_initialize", tracepoint_initialize, 3);
|
45
|
+
rb_define_method(cTracepoint, "_fire_tracepoint", tracepoint_fire, 1);
|
46
|
+
rb_define_method(cTracepoint, "enabled?", tracepoint_enabled, 0);
|
47
|
+
}
|
48
|
+
|
@@ -0,0 +1,231 @@
|
|
1
|
+
#include "tracepoint.h"
|
2
|
+
|
3
|
+
static const rb_data_type_t
|
4
|
+
static_tracing_tracepoint_type;
|
5
|
+
|
6
|
+
static const char*
|
7
|
+
check_name_arg(VALUE provider);
|
8
|
+
|
9
|
+
static const char*
|
10
|
+
check_provider_arg(VALUE provider);
|
11
|
+
|
12
|
+
static char
|
13
|
+
**check_vargs(int *argc, VALUE vargs);
|
14
|
+
|
15
|
+
static void
|
16
|
+
**check_fire_args(int *argc, VALUE vargs);
|
17
|
+
|
18
|
+
VALUE
|
19
|
+
tracepoint_initialize(VALUE self, VALUE provider, VALUE name, VALUE vargs)
|
20
|
+
{
|
21
|
+
VALUE cStaticTracing, cProvider, cProviderInst;
|
22
|
+
static_tracing_tracepoint_t *tracepoint = NULL;
|
23
|
+
const char *c_name_str = NULL;
|
24
|
+
int argc = 0;
|
25
|
+
|
26
|
+
c_name_str = check_name_arg(name);
|
27
|
+
check_provider_arg(provider); // FIXME should only accept string
|
28
|
+
char **args = check_vargs(&argc, vargs);
|
29
|
+
|
30
|
+
/// Get a handle to global provider list for lookup
|
31
|
+
cStaticTracing = rb_const_get(rb_cObject, rb_intern("StaticTracing"));
|
32
|
+
cProvider = rb_const_get(cStaticTracing, rb_intern("Provider"));
|
33
|
+
cProviderInst = rb_funcall(cProvider, rb_intern("register"), 1, provider);
|
34
|
+
|
35
|
+
// Create a probe
|
36
|
+
usdt_probedef_t *probe = usdt_create_probe(c_name_str, c_name_str, argc, args);
|
37
|
+
|
38
|
+
// Use the provider to register a tracepoint
|
39
|
+
int success = provider_add_tracepoint_internal(cProviderInst, probe); // FIXME handle error checking here and throw an exception if failure
|
40
|
+
TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, tracepoint);
|
41
|
+
|
42
|
+
// FIXME check for nulls
|
43
|
+
// FIXME Do we really need to store both references? refactor this.
|
44
|
+
// Store the tracepoint handle in our struct
|
45
|
+
tracepoint->usdt_tracepoint_def = probe;
|
46
|
+
|
47
|
+
return self;
|
48
|
+
}
|
49
|
+
|
50
|
+
VALUE
|
51
|
+
tracepoint_fire(VALUE self, VALUE vargs)
|
52
|
+
{
|
53
|
+
static_tracing_tracepoint_t *res = NULL;
|
54
|
+
TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
|
55
|
+
int argc = 0;
|
56
|
+
void *args = check_fire_args(&argc, vargs);
|
57
|
+
|
58
|
+
usdt_fire_probe(res->usdt_tracepoint_def->probe, argc, args);
|
59
|
+
return Qnil;
|
60
|
+
}
|
61
|
+
|
62
|
+
VALUE
|
63
|
+
tracepoint_enabled(VALUE self)
|
64
|
+
{
|
65
|
+
static_tracing_tracepoint_t *res = NULL;
|
66
|
+
TypedData_Get_Struct(self, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
|
67
|
+
return usdt_is_enabled(res->usdt_tracepoint_def->probe) == 0 ? Qfalse : Qtrue;
|
68
|
+
}
|
69
|
+
|
70
|
+
static const char*
|
71
|
+
check_name_arg(VALUE name)
|
72
|
+
{
|
73
|
+
const char *c_name_str = NULL;
|
74
|
+
|
75
|
+
if (TYPE(name) != T_SYMBOL && TYPE(name) != T_STRING) {
|
76
|
+
rb_raise(rb_eTypeError, "name must be a symbol or string");
|
77
|
+
}
|
78
|
+
if (TYPE(name) == T_SYMBOL) {
|
79
|
+
c_name_str = rb_id2name(rb_to_id(name));
|
80
|
+
} else if (TYPE(name) == T_STRING) {
|
81
|
+
c_name_str = RSTRING_PTR(name);
|
82
|
+
}
|
83
|
+
|
84
|
+
return c_name_str;
|
85
|
+
}
|
86
|
+
|
87
|
+
static const char*
|
88
|
+
check_provider_arg(VALUE provider)
|
89
|
+
{
|
90
|
+
const char *c_provider_str = NULL;
|
91
|
+
|
92
|
+
if (TYPE(provider) != T_SYMBOL && TYPE(provider) != T_STRING) {
|
93
|
+
rb_raise(rb_eTypeError, "provider must be a symbol or string");
|
94
|
+
}
|
95
|
+
if (TYPE(provider) == T_SYMBOL) {
|
96
|
+
c_provider_str = rb_id2name(rb_to_id(provider));
|
97
|
+
} else if (TYPE(provider) == T_STRING) {
|
98
|
+
c_provider_str = RSTRING_PTR(provider);
|
99
|
+
}
|
100
|
+
|
101
|
+
return c_provider_str;
|
102
|
+
}
|
103
|
+
|
104
|
+
static char
|
105
|
+
**check_vargs(int *argc, VALUE vargs)
|
106
|
+
{
|
107
|
+
if(TYPE(vargs) == T_ARRAY)
|
108
|
+
{
|
109
|
+
VALUE rLength = rb_funcall(vargs, rb_intern("length"), 0, Qnil);
|
110
|
+
*argc = NUM2INT(rLength);
|
111
|
+
|
112
|
+
if(*argc > 6)
|
113
|
+
{
|
114
|
+
printf("ERROR - passed %i args, maximum 6 argument types can be passed", *argc);
|
115
|
+
return NULL;
|
116
|
+
}
|
117
|
+
// FIXME ensure this is freed
|
118
|
+
char **args = malloc(*argc * sizeof(char*));
|
119
|
+
for (int i = 0; i < *argc; i++)
|
120
|
+
{
|
121
|
+
VALUE str = rb_funcall(rb_ary_entry(vargs, i), rb_intern("to_s"), 0, Qnil);
|
122
|
+
const char* cStr = RSTRING_PTR(str);
|
123
|
+
if (strcmp(cStr, "Integer")) {
|
124
|
+
args[i] = strdup(cStr);
|
125
|
+
} else if (strcmp(cStr, "String")) {
|
126
|
+
args[i] = strdup(cStr);
|
127
|
+
} else {
|
128
|
+
printf("ERROR - type \"%s\" is unsupported\n", cStr);
|
129
|
+
}
|
130
|
+
}
|
131
|
+
return args;
|
132
|
+
} else {
|
133
|
+
printf("ERROR - array was expected\n");
|
134
|
+
return NULL;
|
135
|
+
}
|
136
|
+
}
|
137
|
+
|
138
|
+
|
139
|
+
/*
|
140
|
+
* Yeah, returning a void ** array is a bit sketchy, but since
|
141
|
+
* usdt_fire_probe takes a void **, that's what we'll give it.
|
142
|
+
*
|
143
|
+
* The structure of the data is actually an array of 64 bit unions
|
144
|
+
* So the size of the data should be argc * 8 bytes.
|
145
|
+
* We assume that reads will be aligned on 64 bits in the tracer.
|
146
|
+
*
|
147
|
+
* The approach libstapsdt takes is pretty similar, just not an array.
|
148
|
+
*/
|
149
|
+
static void
|
150
|
+
**check_fire_args(int *argc, VALUE vargs)
|
151
|
+
{
|
152
|
+
if(TYPE(vargs) == T_ARRAY)
|
153
|
+
{
|
154
|
+
VALUE rLength = rb_funcall(vargs, rb_intern("length"), 0, Qnil);
|
155
|
+
*argc = NUM2INT(rLength);
|
156
|
+
|
157
|
+
if(*argc > 6)
|
158
|
+
{
|
159
|
+
printf("ERROR - passed %i args, maximum 6 argument types can be passed", *argc);
|
160
|
+
return NULL;
|
161
|
+
}
|
162
|
+
|
163
|
+
Tracepoint_fire_arg *args = malloc(*argc * sizeof(Tracepoint_fire_arg));
|
164
|
+
//printf("SIZE: %i ARGC: %i \n", sizeof(Tracepoint_fire_arg), *argc);
|
165
|
+
// FIXME check against registered argtypes here
|
166
|
+
for (int i = 0; i < *argc; i++)
|
167
|
+
{
|
168
|
+
VALUE val = rb_ary_entry(vargs, i);
|
169
|
+
switch(TYPE(val))
|
170
|
+
{
|
171
|
+
case T_FIXNUM:
|
172
|
+
args[i].intval = FIX2LONG(val);
|
173
|
+
break;
|
174
|
+
case T_STRING:
|
175
|
+
args[i].strval = RSTRING_PTR(val);
|
176
|
+
break;
|
177
|
+
default:
|
178
|
+
printf("ERROR unsupported type passed for argument %i to fire\n", i);
|
179
|
+
break;
|
180
|
+
}
|
181
|
+
}
|
182
|
+
// This downcast is explained the comment section of this function.
|
183
|
+
return (void **) args;
|
184
|
+
} else {
|
185
|
+
printf("ERROR - array was expected\n");
|
186
|
+
return NULL;
|
187
|
+
}
|
188
|
+
}
|
189
|
+
|
190
|
+
// Allocate a static_tracing_tracepoint_type struct for ruby memory management
|
191
|
+
VALUE
|
192
|
+
static_tracing_tracepoint_alloc(VALUE klass)
|
193
|
+
{
|
194
|
+
static_tracing_tracepoint_t *res;
|
195
|
+
VALUE obj = TypedData_Make_Struct(klass, static_tracing_tracepoint_t, &static_tracing_tracepoint_type, res);
|
196
|
+
return obj;
|
197
|
+
}
|
198
|
+
|
199
|
+
static inline void
|
200
|
+
static_tracing_tracepoint_mark(void *ptr)
|
201
|
+
{
|
202
|
+
/* noop */
|
203
|
+
}
|
204
|
+
|
205
|
+
static inline void
|
206
|
+
static_tracing_tracepoint_free(void *ptr)
|
207
|
+
{
|
208
|
+
static_tracing_tracepoint_t *res = (static_tracing_tracepoint_t *) ptr;
|
209
|
+
//if (res->name) {
|
210
|
+
// free(res->name);
|
211
|
+
// res->name = NULL;
|
212
|
+
//}
|
213
|
+
xfree(res);
|
214
|
+
}
|
215
|
+
|
216
|
+
static inline size_t
|
217
|
+
static_tracing_tracepoint_memsize(const void *ptr)
|
218
|
+
{
|
219
|
+
return sizeof(static_tracing_provider_t);
|
220
|
+
}
|
221
|
+
|
222
|
+
static const rb_data_type_t
|
223
|
+
static_tracing_tracepoint_type = {
|
224
|
+
"static_tracing_tracepoint",
|
225
|
+
{
|
226
|
+
static_tracing_tracepoint_mark,
|
227
|
+
static_tracing_tracepoint_free,
|
228
|
+
static_tracing_tracepoint_memsize
|
229
|
+
},
|
230
|
+
NULL, NULL, RUBY_TYPED_FREE_IMMEDIATELY
|
231
|
+
};
|