ruby-dtrace-consumer 0.4.0
Sign up to get free protection for your applications and to get access to all the features.
- data/LICENCE +20 -0
- data/README.md +51 -0
- data/ext/Makefile +187 -0
- data/ext/dtrace_aggdata.c +132 -0
- data/ext/dtrace_aggdata.c~ +141 -0
- data/ext/dtrace_aggdata.o +0 -0
- data/ext/dtrace_api.bundle +0 -0
- data/ext/dtrace_api.c +102 -0
- data/ext/dtrace_api.c~ +113 -0
- data/ext/dtrace_api.h +138 -0
- data/ext/dtrace_api.h~ +155 -0
- data/ext/dtrace_api.o +0 -0
- data/ext/dtrace_bufdata.c +130 -0
- data/ext/dtrace_bufdata.c~ +139 -0
- data/ext/dtrace_bufdata.o +0 -0
- data/ext/dtrace_dropdata.c +121 -0
- data/ext/dtrace_dropdata.c~ +131 -0
- data/ext/dtrace_dropdata.o +0 -0
- data/ext/dtrace_errdata.c +100 -0
- data/ext/dtrace_errdata.c~ +110 -0
- data/ext/dtrace_errdata.o +0 -0
- data/ext/dtrace_hdl.c +677 -0
- data/ext/dtrace_hdl.c~ +689 -0
- data/ext/dtrace_hdl.o +0 -0
- data/ext/dtrace_probedata.c +273 -0
- data/ext/dtrace_probedata.c~ +283 -0
- data/ext/dtrace_probedata.o +0 -0
- data/ext/dtrace_probedesc.c +93 -0
- data/ext/dtrace_probedesc.c~ +78 -0
- data/ext/dtrace_probedesc.o +0 -0
- data/ext/dtrace_process.c +44 -0
- data/ext/dtrace_process.c~ +56 -0
- data/ext/dtrace_process.o +0 -0
- data/ext/dtrace_program.c +52 -0
- data/ext/dtrace_program.c~ +62 -0
- data/ext/dtrace_program.o +0 -0
- data/ext/dtrace_programinfo.c +70 -0
- data/ext/dtrace_programinfo.c~ +60 -0
- data/ext/dtrace_programinfo.o +0 -0
- data/ext/dtrace_recdesc.c +37 -0
- data/ext/dtrace_recdesc.c~ +46 -0
- data/ext/dtrace_recdesc.o +0 -0
- data/ext/dtrace_util.c +92 -0
- data/ext/dtrace_util.o +0 -0
- data/ext/extconf.rb +7 -0
- data/lib/dtrace.rb +95 -0
- data/lib/dtrace/aggregate.rb +40 -0
- data/lib/dtrace/aggregateset.rb +19 -0
- data/lib/dtrace/consumer.rb +174 -0
- data/lib/dtrace/data.rb +85 -0
- data/lib/dtrace/dof.rb +8 -0
- data/lib/dtrace/printfrecord.rb +10 -0
- data/lib/dtrace/probedata.rb +23 -0
- data/lib/dtrace/probedesc.rb +15 -0
- data/lib/dtrace/record.rb +11 -0
- data/lib/dtrace/stackrecord.rb +31 -0
- data/lib/dtrace/tracer.rb +35 -0
- data/lib/dtrace/version.rb +8 -0
- data/lib/dtrace/version.rb~ +8 -0
- data/lib/dtraceconsumer.rb +9 -0
- data/test/test_aggregates.rb +45 -0
- data/test/test_drops_errors.rb +166 -0
- data/test/test_dtrace.rb +155 -0
- data/test/test_gc.rb +11 -0
- data/test/test_helper.rb +20 -0
- data/test/test_helper.rb~ +16 -0
- data/test/test_legacy_consumer.rb +47 -0
- data/test/test_probedata.rb +30 -0
- data/test/test_processes.rb +66 -0
- data/test/test_profile.rb +198 -0
- data/test/test_repeat.rb +50 -0
- data/test/test_rubyprobe.rb +52 -0
- data/test/test_rubyprobe.rb~ +52 -0
- data/test/test_typefilter.rb +94 -0
- metadata +121 -0
data/ext/dtrace_api.o
ADDED
Binary file
|
@@ -0,0 +1,130 @@
|
|
1
|
+
/* Ruby-DTrace
|
2
|
+
* (c) 2007 Chris Andrews <chris@nodnol.org>
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include "dtrace_api.h"
|
6
|
+
|
7
|
+
RUBY_EXTERN VALUE eDTraceException;
|
8
|
+
RUBY_EXTERN VALUE cDTraceAggData;
|
9
|
+
RUBY_EXTERN VALUE cDTraceRecDesc;
|
10
|
+
RUBY_EXTERN VALUE cDTraceProbe;
|
11
|
+
|
12
|
+
/*
|
13
|
+
* Returns the enabled probe id which generated this data
|
14
|
+
*/
|
15
|
+
VALUE dtracebufdata_epid(VALUE self)
|
16
|
+
{
|
17
|
+
dtrace_bufdata_t *bufdata;
|
18
|
+
|
19
|
+
Data_Get_Struct(self, dtrace_bufdata_t, bufdata);
|
20
|
+
|
21
|
+
if (bufdata->dtbda_probe) {
|
22
|
+
return INT2FIX(bufdata->dtbda_probe->dtpda_edesc->dtepd_epid);
|
23
|
+
}
|
24
|
+
|
25
|
+
return Qnil;
|
26
|
+
}
|
27
|
+
|
28
|
+
|
29
|
+
/*
|
30
|
+
* Returns the DTraceProbe for the probe which generated this data
|
31
|
+
*/
|
32
|
+
VALUE dtracebufdata_probe(VALUE self)
|
33
|
+
{
|
34
|
+
dtrace_bufdata_t *bufdata;
|
35
|
+
VALUE dtraceprobe;
|
36
|
+
|
37
|
+
Data_Get_Struct(self, dtrace_bufdata_t, bufdata);
|
38
|
+
|
39
|
+
if (bufdata->dtbda_probe) {
|
40
|
+
dtraceprobe = Data_Wrap_Struct(cDTraceProbe, 0, NULL, (dtrace_probedesc_t *)bufdata->dtbda_probe->dtpda_pdesc);
|
41
|
+
return dtraceprobe;
|
42
|
+
}
|
43
|
+
|
44
|
+
return Qnil;
|
45
|
+
}
|
46
|
+
|
47
|
+
/*
|
48
|
+
* Returns the record in this DTraceBufdata. Records are returned as
|
49
|
+
* either DTraceRecords or DTraceStackRecords as appropriate for the
|
50
|
+
* type of action.
|
51
|
+
*/
|
52
|
+
VALUE dtracebufdata_record(VALUE self)
|
53
|
+
{
|
54
|
+
dtrace_bufdata_t *bufdata;
|
55
|
+
const dtrace_recdesc_t *rec;
|
56
|
+
dtrace_actkind_t act = DTRACEACT_NONE;
|
57
|
+
const char *s;
|
58
|
+
VALUE v = Qnil;
|
59
|
+
VALUE dtracerecord;
|
60
|
+
VALUE dtraceaggdata;
|
61
|
+
VALUE dtracerecdesc;
|
62
|
+
|
63
|
+
Data_Get_Struct(self, dtrace_bufdata_t, bufdata);
|
64
|
+
|
65
|
+
if (bufdata->dtbda_aggdata) {
|
66
|
+
dtraceaggdata = Data_Wrap_Struct(cDTraceAggData, 0, NULL, (dtrace_bufdata_t *)bufdata);
|
67
|
+
return dtraceaggdata;
|
68
|
+
}
|
69
|
+
|
70
|
+
s = bufdata->dtbda_buffered;
|
71
|
+
if (s == NULL) {
|
72
|
+
return Qnil;
|
73
|
+
}
|
74
|
+
|
75
|
+
rec = bufdata->dtbda_recdesc;
|
76
|
+
if (rec) {
|
77
|
+
act = rec->dtrd_action;
|
78
|
+
}
|
79
|
+
|
80
|
+
switch (act) {
|
81
|
+
case DTRACEACT_DIFEXPR:
|
82
|
+
/* trace() action */
|
83
|
+
break;
|
84
|
+
case DTRACEACT_PRINTF:
|
85
|
+
/* printf action, not available in probedata */
|
86
|
+
v = rb_str_new2(s);
|
87
|
+
dtracerecord = rb_class_new_instance(0, NULL, rb_path2class("DTrace::PrintfRecord"));
|
88
|
+
rb_iv_set(dtracerecord, "@from", rb_str_new2("bufdata"));
|
89
|
+
rb_iv_set(dtracerecord, "@value", v);
|
90
|
+
return (dtracerecord);
|
91
|
+
break;
|
92
|
+
case DTRACEACT_STACK:
|
93
|
+
case DTRACEACT_USTACK:
|
94
|
+
case DTRACEACT_JSTACK:
|
95
|
+
/* stand-alone stack(), ustack(), or jstack() action */
|
96
|
+
v = rb_str_new2(s);
|
97
|
+
dtracerecord = rb_class_new_instance(0, NULL, rb_path2class("DTrace::StackRecord"));
|
98
|
+
rb_iv_set(dtracerecord, "@from", rb_str_new2("bufdata"));
|
99
|
+
rb_funcall(dtracerecord, rb_intern("parse"), 1, v);
|
100
|
+
return (dtracerecord);
|
101
|
+
break;
|
102
|
+
case DTRACEACT_USYM:
|
103
|
+
case DTRACEACT_UADDR:
|
104
|
+
case DTRACEACT_UMOD:
|
105
|
+
case DTRACEACT_SYM:
|
106
|
+
case DTRACEACT_MOD:
|
107
|
+
v = rb_str_new2(s);
|
108
|
+
break;
|
109
|
+
case DTRACEACT_PRINTA:
|
110
|
+
v = rb_str_new2(s);
|
111
|
+
break;
|
112
|
+
default:
|
113
|
+
/*
|
114
|
+
* The record handle defers nothing else to this
|
115
|
+
* bufhandler.
|
116
|
+
*/
|
117
|
+
break;
|
118
|
+
}
|
119
|
+
|
120
|
+
if (!NIL_P(v)) {
|
121
|
+
dtracerecord = rb_class_new_instance(0, NULL, rb_path2class("DTrace::Record"));
|
122
|
+
rb_iv_set(dtracerecord, "@value", v);
|
123
|
+
rb_iv_set(dtracerecord, "@action", INT2FIX(act));
|
124
|
+
rb_iv_set(dtracerecord, "@from", rb_str_new2("bufdata"));
|
125
|
+
return (dtracerecord);
|
126
|
+
}
|
127
|
+
else {
|
128
|
+
return Qnil;
|
129
|
+
}
|
130
|
+
}
|
@@ -0,0 +1,139 @@
|
|
1
|
+
/* Ruby-DTrace
|
2
|
+
* (c) 2007 Chris Andrews <chris@nodnol.org>
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include "dtrace_api.h"
|
6
|
+
|
7
|
+
RUBY_EXTERN VALUE eDTraceException;
|
8
|
+
RUBY_EXTERN VALUE cDTraceAggData;
|
9
|
+
RUBY_EXTERN VALUE cDTraceRecDesc;
|
10
|
+
RUBY_EXTERN VALUE cDTraceProbe;
|
11
|
+
|
12
|
+
/* :nodoc: */
|
13
|
+
VALUE dtracebufdata_init(VALUE self)
|
14
|
+
{
|
15
|
+
dtrace_bufdata_t *data;
|
16
|
+
|
17
|
+
Data_Get_Struct(self, dtrace_bufdata_t, data);
|
18
|
+
return self;
|
19
|
+
}
|
20
|
+
|
21
|
+
/*
|
22
|
+
* Returns the enabled probe id which generated this data
|
23
|
+
*/
|
24
|
+
VALUE dtracebufdata_epid(VALUE self)
|
25
|
+
{
|
26
|
+
dtrace_bufdata_t *bufdata;
|
27
|
+
|
28
|
+
Data_Get_Struct(self, dtrace_bufdata_t, bufdata);
|
29
|
+
|
30
|
+
if (bufdata->dtbda_probe) {
|
31
|
+
return INT2FIX(bufdata->dtbda_probe->dtpda_edesc->dtepd_epid);
|
32
|
+
}
|
33
|
+
|
34
|
+
return Qnil;
|
35
|
+
}
|
36
|
+
|
37
|
+
|
38
|
+
/*
|
39
|
+
* Returns the DTraceProbe for the probe which generated this data
|
40
|
+
*/
|
41
|
+
VALUE dtracebufdata_probe(VALUE self)
|
42
|
+
{
|
43
|
+
dtrace_bufdata_t *bufdata;
|
44
|
+
VALUE dtraceprobe;
|
45
|
+
|
46
|
+
Data_Get_Struct(self, dtrace_bufdata_t, bufdata);
|
47
|
+
|
48
|
+
if (bufdata->dtbda_probe) {
|
49
|
+
dtraceprobe = Data_Wrap_Struct(cDTraceProbe, 0, NULL, (dtrace_probedesc_t *)bufdata->dtbda_probe->dtpda_pdesc);
|
50
|
+
return dtraceprobe;
|
51
|
+
}
|
52
|
+
|
53
|
+
return Qnil;
|
54
|
+
}
|
55
|
+
|
56
|
+
/*
|
57
|
+
* Returns the record in this DTraceBufdata. Records are returned as
|
58
|
+
* either DTraceRecords or DTraceStackRecords as appropriate for the
|
59
|
+
* type of action.
|
60
|
+
*/
|
61
|
+
VALUE dtracebufdata_record(VALUE self)
|
62
|
+
{
|
63
|
+
dtrace_bufdata_t *bufdata;
|
64
|
+
const dtrace_recdesc_t *rec;
|
65
|
+
dtrace_actkind_t act = DTRACEACT_NONE;
|
66
|
+
const char *s;
|
67
|
+
VALUE v = Qnil;
|
68
|
+
VALUE dtracerecord;
|
69
|
+
VALUE dtraceaggdata;
|
70
|
+
VALUE dtracerecdesc;
|
71
|
+
|
72
|
+
Data_Get_Struct(self, dtrace_bufdata_t, bufdata);
|
73
|
+
|
74
|
+
if (bufdata->dtbda_aggdata) {
|
75
|
+
dtraceaggdata = Data_Wrap_Struct(cDTraceAggData, 0, NULL, (dtrace_bufdata_t *)bufdata);
|
76
|
+
return dtraceaggdata;
|
77
|
+
}
|
78
|
+
|
79
|
+
s = bufdata->dtbda_buffered;
|
80
|
+
if (s == NULL) {
|
81
|
+
return Qnil;
|
82
|
+
}
|
83
|
+
|
84
|
+
rec = bufdata->dtbda_recdesc;
|
85
|
+
if (rec) {
|
86
|
+
act = rec->dtrd_action;
|
87
|
+
}
|
88
|
+
|
89
|
+
switch (act) {
|
90
|
+
case DTRACEACT_DIFEXPR:
|
91
|
+
/* trace() action */
|
92
|
+
break;
|
93
|
+
case DTRACEACT_PRINTF:
|
94
|
+
/* printf action, not available in probedata */
|
95
|
+
v = rb_str_new2(s);
|
96
|
+
dtracerecord = rb_class_new_instance(0, NULL, rb_path2class("DTrace::PrintfRecord"));
|
97
|
+
rb_iv_set(dtracerecord, "@from", rb_str_new2("bufdata"));
|
98
|
+
rb_iv_set(dtracerecord, "@value", v);
|
99
|
+
return (dtracerecord);
|
100
|
+
break;
|
101
|
+
case DTRACEACT_STACK:
|
102
|
+
case DTRACEACT_USTACK:
|
103
|
+
case DTRACEACT_JSTACK:
|
104
|
+
/* stand-alone stack(), ustack(), or jstack() action */
|
105
|
+
v = rb_str_new2(s);
|
106
|
+
dtracerecord = rb_class_new_instance(0, NULL, rb_path2class("DTrace::StackRecord"));
|
107
|
+
rb_iv_set(dtracerecord, "@from", rb_str_new2("bufdata"));
|
108
|
+
rb_funcall(dtracerecord, rb_intern("parse"), 1, v);
|
109
|
+
return (dtracerecord);
|
110
|
+
break;
|
111
|
+
case DTRACEACT_USYM:
|
112
|
+
case DTRACEACT_UADDR:
|
113
|
+
case DTRACEACT_UMOD:
|
114
|
+
case DTRACEACT_SYM:
|
115
|
+
case DTRACEACT_MOD:
|
116
|
+
v = rb_str_new2(s);
|
117
|
+
break;
|
118
|
+
case DTRACEACT_PRINTA:
|
119
|
+
v = rb_str_new2(s);
|
120
|
+
break;
|
121
|
+
default:
|
122
|
+
/*
|
123
|
+
* The record handle defers nothing else to this
|
124
|
+
* bufhandler.
|
125
|
+
*/
|
126
|
+
break;
|
127
|
+
}
|
128
|
+
|
129
|
+
if (!NIL_P(v)) {
|
130
|
+
dtracerecord = rb_class_new_instance(0, NULL, rb_path2class("DTrace::Record"));
|
131
|
+
rb_iv_set(dtracerecord, "@value", v);
|
132
|
+
rb_iv_set(dtracerecord, "@action", INT2FIX(act));
|
133
|
+
rb_iv_set(dtracerecord, "@from", rb_str_new2("bufdata"));
|
134
|
+
return (dtracerecord);
|
135
|
+
}
|
136
|
+
else {
|
137
|
+
return Qnil;
|
138
|
+
}
|
139
|
+
}
|
Binary file
|
@@ -0,0 +1,121 @@
|
|
1
|
+
/* Ruby-DTrace
|
2
|
+
* (c) 2007 Chris Andrews <chris@nodnol.org>
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include "dtrace_api.h"
|
6
|
+
|
7
|
+
RUBY_EXTERN VALUE eDTraceException;
|
8
|
+
|
9
|
+
/* Returns the CPU which generated this drop record */
|
10
|
+
VALUE dtracedropdata_cpu(VALUE self)
|
11
|
+
{
|
12
|
+
dtrace_dropdata_t *data;
|
13
|
+
processorid_t cpu;
|
14
|
+
|
15
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
16
|
+
|
17
|
+
if (data) {
|
18
|
+
cpu = data->dtdda_cpu;
|
19
|
+
return INT2FIX(cpu);
|
20
|
+
}
|
21
|
+
else {
|
22
|
+
return Qnil;
|
23
|
+
}
|
24
|
+
}
|
25
|
+
|
26
|
+
/* Returns the number of records dropped in this drop record */
|
27
|
+
VALUE dtracedropdata_drops(VALUE self)
|
28
|
+
{
|
29
|
+
dtrace_dropdata_t *data;
|
30
|
+
|
31
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
32
|
+
|
33
|
+
if (data) {
|
34
|
+
return INT2FIX(data->dtdda_drops);
|
35
|
+
}
|
36
|
+
else {
|
37
|
+
return Qnil;
|
38
|
+
}
|
39
|
+
}
|
40
|
+
|
41
|
+
/* Returns the number of records dropped in total */
|
42
|
+
VALUE dtracedropdata_total(VALUE self)
|
43
|
+
{
|
44
|
+
dtrace_dropdata_t *data;
|
45
|
+
|
46
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
47
|
+
|
48
|
+
if (data) {
|
49
|
+
return INT2FIX(data->dtdda_total);
|
50
|
+
}
|
51
|
+
else {
|
52
|
+
return Qnil;
|
53
|
+
}
|
54
|
+
}
|
55
|
+
|
56
|
+
/* Returns a message from the DTrace library describing this drop
|
57
|
+
record. */
|
58
|
+
VALUE dtracedropdata_msg(VALUE self)
|
59
|
+
{
|
60
|
+
dtrace_dropdata_t *data;
|
61
|
+
|
62
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
63
|
+
|
64
|
+
if (data) {
|
65
|
+
return rb_str_new2(data->dtdda_msg);
|
66
|
+
}
|
67
|
+
else {
|
68
|
+
return Qnil;
|
69
|
+
}
|
70
|
+
}
|
71
|
+
|
72
|
+
/* Returns the reason for the drop (the "drop kind") */
|
73
|
+
VALUE dtracedropdata_kind(VALUE self)
|
74
|
+
{
|
75
|
+
dtrace_dropdata_t *data;
|
76
|
+
VALUE kind;
|
77
|
+
|
78
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
79
|
+
|
80
|
+
if (data) {
|
81
|
+
switch (data->dtdda_kind) {
|
82
|
+
case DTRACEDROP_PRINCIPAL:
|
83
|
+
kind = rb_str_new2("drop to principal buffer");
|
84
|
+
break;
|
85
|
+
case DTRACEDROP_AGGREGATION:
|
86
|
+
kind = rb_str_new2("drop to aggregation buffer");
|
87
|
+
break;
|
88
|
+
case DTRACEDROP_DYNAMIC:
|
89
|
+
kind = rb_str_new2("dynamic drop");
|
90
|
+
break;
|
91
|
+
case DTRACEDROP_DYNRINSE:
|
92
|
+
kind = rb_str_new2("dyn drop due to rinsing");
|
93
|
+
break;
|
94
|
+
case DTRACEDROP_DYNDIRTY:
|
95
|
+
kind = rb_str_new2("dyn drop due to dirty");
|
96
|
+
break;
|
97
|
+
case DTRACEDROP_SPEC:
|
98
|
+
kind = rb_str_new2("speculative drop");
|
99
|
+
break;
|
100
|
+
case DTRACEDROP_SPECBUSY:
|
101
|
+
kind = rb_str_new2("spec drop due to busy");
|
102
|
+
break;
|
103
|
+
case DTRACEDROP_SPECUNAVAIL:
|
104
|
+
kind = rb_str_new2("spec drop due to unavail");
|
105
|
+
break;
|
106
|
+
case DTRACEDROP_STKSTROVERFLOW:
|
107
|
+
kind = rb_str_new2("stack string tab overflow");
|
108
|
+
break;
|
109
|
+
case DTRACEDROP_DBLERROR:
|
110
|
+
kind = rb_str_new2("error in ERROR probe");
|
111
|
+
break;
|
112
|
+
default:
|
113
|
+
kind = rb_str_new2("unknown");
|
114
|
+
break;
|
115
|
+
}
|
116
|
+
return kind;
|
117
|
+
}
|
118
|
+
else {
|
119
|
+
return Qnil;
|
120
|
+
}
|
121
|
+
}
|
@@ -0,0 +1,131 @@
|
|
1
|
+
/* Ruby-DTrace
|
2
|
+
* (c) 2007 Chris Andrews <chris@nodnol.org>
|
3
|
+
*/
|
4
|
+
|
5
|
+
#include "dtrace_api.h"
|
6
|
+
|
7
|
+
RUBY_EXTERN VALUE eDTraceException;
|
8
|
+
|
9
|
+
/* :nodoc: */
|
10
|
+
VALUE dtracedropdata_init(VALUE self)
|
11
|
+
{
|
12
|
+
dtrace_dropdata_t *data;
|
13
|
+
|
14
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
15
|
+
return self;
|
16
|
+
}
|
17
|
+
|
18
|
+
/* Returns the CPU which generated this drop record */
|
19
|
+
VALUE dtracedropdata_cpu(VALUE self)
|
20
|
+
{
|
21
|
+
dtrace_dropdata_t *data;
|
22
|
+
processorid_t cpu;
|
23
|
+
|
24
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
25
|
+
|
26
|
+
if (data) {
|
27
|
+
cpu = data->dtdda_cpu;
|
28
|
+
return INT2FIX(cpu);
|
29
|
+
}
|
30
|
+
else {
|
31
|
+
return Qnil;
|
32
|
+
}
|
33
|
+
}
|
34
|
+
|
35
|
+
/* Returns the number of records dropped in this drop record */
|
36
|
+
VALUE dtracedropdata_drops(VALUE self)
|
37
|
+
{
|
38
|
+
dtrace_dropdata_t *data;
|
39
|
+
|
40
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
41
|
+
|
42
|
+
if (data) {
|
43
|
+
return INT2FIX(data->dtdda_drops);
|
44
|
+
}
|
45
|
+
else {
|
46
|
+
return Qnil;
|
47
|
+
}
|
48
|
+
}
|
49
|
+
|
50
|
+
/* Returns the number of records dropped in total */
|
51
|
+
VALUE dtracedropdata_total(VALUE self)
|
52
|
+
{
|
53
|
+
dtrace_dropdata_t *data;
|
54
|
+
|
55
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
56
|
+
|
57
|
+
if (data) {
|
58
|
+
return INT2FIX(data->dtdda_total);
|
59
|
+
}
|
60
|
+
else {
|
61
|
+
return Qnil;
|
62
|
+
}
|
63
|
+
}
|
64
|
+
|
65
|
+
/* Returns a message from the DTrace library describing this drop
|
66
|
+
record. */
|
67
|
+
VALUE dtracedropdata_msg(VALUE self)
|
68
|
+
{
|
69
|
+
dtrace_dropdata_t *data;
|
70
|
+
|
71
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
72
|
+
|
73
|
+
if (data) {
|
74
|
+
return rb_str_new2(data->dtdda_msg);
|
75
|
+
}
|
76
|
+
else {
|
77
|
+
return Qnil;
|
78
|
+
}
|
79
|
+
}
|
80
|
+
|
81
|
+
/* Returns the reason for the drop (the "drop kind") */
|
82
|
+
VALUE dtracedropdata_kind(VALUE self)
|
83
|
+
{
|
84
|
+
dtrace_dropdata_t *data;
|
85
|
+
VALUE kind;
|
86
|
+
|
87
|
+
Data_Get_Struct(self, dtrace_dropdata_t, data);
|
88
|
+
|
89
|
+
if (data) {
|
90
|
+
switch (data->dtdda_kind) {
|
91
|
+
case DTRACEDROP_PRINCIPAL:
|
92
|
+
kind = rb_str_new2("drop to principal buffer");
|
93
|
+
break;
|
94
|
+
case DTRACEDROP_AGGREGATION:
|
95
|
+
kind = rb_str_new2("drop to aggregation buffer");
|
96
|
+
break;
|
97
|
+
case DTRACEDROP_DYNAMIC:
|
98
|
+
kind = rb_str_new2("dynamic drop");
|
99
|
+
break;
|
100
|
+
case DTRACEDROP_DYNRINSE:
|
101
|
+
kind = rb_str_new2("dyn drop due to rinsing");
|
102
|
+
break;
|
103
|
+
case DTRACEDROP_DYNDIRTY:
|
104
|
+
kind = rb_str_new2("dyn drop due to dirty");
|
105
|
+
break;
|
106
|
+
case DTRACEDROP_SPEC:
|
107
|
+
kind = rb_str_new2("speculative drop");
|
108
|
+
break;
|
109
|
+
case DTRACEDROP_SPECBUSY:
|
110
|
+
kind = rb_str_new2("spec drop due to busy");
|
111
|
+
break;
|
112
|
+
case DTRACEDROP_SPECUNAVAIL:
|
113
|
+
kind = rb_str_new2("spec drop due to unavail");
|
114
|
+
break;
|
115
|
+
case DTRACEDROP_STKSTROVERFLOW:
|
116
|
+
kind = rb_str_new2("stack string tab overflow");
|
117
|
+
break;
|
118
|
+
case DTRACEDROP_DBLERROR:
|
119
|
+
kind = rb_str_new2("error in ERROR probe");
|
120
|
+
break;
|
121
|
+
default:
|
122
|
+
kind = rb_str_new2("unknown");
|
123
|
+
break;
|
124
|
+
}
|
125
|
+
return kind;
|
126
|
+
}
|
127
|
+
else {
|
128
|
+
return Qnil;
|
129
|
+
}
|
130
|
+
}
|
131
|
+
|