ruby-usdt 0.0.1

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.
@@ -0,0 +1,65 @@
1
+ /*
2
+ * Stub functions containing DTrace tracepoints for probes and
3
+ * is-enabled probes. These functions are copied for each probe
4
+ * dynamically created.
5
+ *
6
+ */
7
+ .text
8
+
9
+ .align 4, 0x90
10
+ .globl usdt_tracepoint_isenabled
11
+ .globl _usdt_tracepoint_isenabled
12
+ .globl usdt_tracepoint_probe
13
+ .globl _usdt_tracepoint_probe
14
+ .globl usdt_tracepoint_end
15
+ .globl _usdt_tracepoint_end
16
+ .globl usdt_probe_args
17
+ .globl _usdt_probe_args
18
+
19
+ usdt_tracepoint_isenabled:
20
+ _usdt_tracepoint_isenabled:
21
+ pushl %ebp
22
+ movl %esp, %ebp
23
+ subl $8, %esp
24
+ xorl %eax, %eax
25
+ nop
26
+ nop
27
+ leave
28
+ ret
29
+ usdt_tracepoint_probe:
30
+ _usdt_tracepoint_probe:
31
+ nop
32
+ nop
33
+ nop
34
+ nop
35
+ nop
36
+ addl $0x20,%esp
37
+ leave
38
+ usdt_tracepoint_end:
39
+ _usdt_tracepoint_end:
40
+ ret
41
+
42
+ /*
43
+ * Probe argument marshalling, i386 style
44
+ *
45
+ */
46
+
47
+ usdt_probe_args:
48
+ _usdt_probe_args:
49
+ pushl %ebp
50
+ movl %esp,%ebp
51
+ subl $8,%esp
52
+ subl $8,%esp
53
+ movl 8(%ebp),%ebx
54
+ movl 0xc(%ebp),%ecx
55
+ test %ecx,%ecx
56
+ je fire
57
+ args: movl %ecx,%eax
58
+ sal $2,%eax
59
+ subl $4,%eax
60
+ addl 0x10(%ebp),%eax
61
+ pushl (%eax)
62
+ dec %ecx
63
+ jne args
64
+ fire: jmp *%ebx
65
+
@@ -0,0 +1,83 @@
1
+ /*
2
+ * Stub functions containing DTrace tracepoints for probes and
3
+ * is-enabled probes. These functions are copied for each probe
4
+ * dynamically created.
5
+ *
6
+ */
7
+ .text
8
+
9
+ .align 4, 0x90
10
+ .globl usdt_tracepoint_isenabled
11
+ .globl _usdt_tracepoint_isenabled
12
+ .globl usdt_tracepoint_probe
13
+ .globl _usdt_tracepoint_probe
14
+ .globl usdt_tracepoint_end
15
+ .globl _usdt_tracepoint_end
16
+ .globl usdt_probe_args
17
+ .globl _usdt_probe_args
18
+
19
+ usdt_tracepoint_isenabled:
20
+ _usdt_tracepoint_isenabled:
21
+ pushq %rbp
22
+ movq %rsp, %rbp
23
+ xorq %rax, %rax
24
+ nop
25
+ nop
26
+ leave
27
+ ret
28
+ usdt_tracepoint_probe:
29
+ _usdt_tracepoint_probe:
30
+ nop
31
+ nop
32
+ nop
33
+ nop
34
+ nop
35
+ popq %r11
36
+ popq %rbx
37
+ popq %r12
38
+ addq $0x18,%rsp
39
+ leave
40
+ usdt_tracepoint_end:
41
+ _usdt_tracepoint_end:
42
+ ret
43
+
44
+ /*
45
+ * Probe argument marshalling, x86_64 style
46
+ *
47
+ */
48
+
49
+ usdt_probe_args:
50
+ _usdt_probe_args:
51
+ pushq %rbp
52
+ movq %rsp,%rbp
53
+ subq $0x18,%rsp
54
+ pushq %r12
55
+ pushq %rbx
56
+ pushq %r11
57
+ movq %rdi,%r12
58
+ movq %rsi,%rbx
59
+ movq %rdx,%r11
60
+ test %rbx,%rbx
61
+ je fire
62
+ movq (%r11),%rdi
63
+ dec %rbx
64
+ test %rbx,%rbx
65
+ je fire
66
+ movq 8(%r11),%rsi
67
+ dec %rbx
68
+ test %rbx,%rbx
69
+ je fire
70
+ movq 16(%r11),%rdx
71
+ dec %rbx
72
+ test %rbx,%rbx
73
+ je fire
74
+ movq 24(%r11),%rcx
75
+ dec %rbx
76
+ test %rbx,%rbx
77
+ je fire
78
+ movq 32(%r11),%r8
79
+ dec %rbx
80
+ test %rbx,%rbx
81
+ je fire
82
+ movq 40(%r11),%r9
83
+ fire: jmp *%r12
data/ext/usdt/Makefile ADDED
@@ -0,0 +1,157 @@
1
+
2
+ SHELL = /bin/sh
3
+
4
+ #### Start of system configuration section. ####
5
+
6
+ srcdir = .
7
+ topdir = /Users/kevin/.rvm/rubies/ruby-1.8.7-p358/lib/ruby/1.8/i686-darwin11.3.0
8
+ hdrdir = $(topdir)
9
+ VPATH = $(srcdir):$(topdir):$(hdrdir)
10
+ prefix = $(DESTDIR)/Users/kevin/.rvm/rubies/ruby-1.8.7-p358
11
+ exec_prefix = $(prefix)
12
+ htmldir = $(docdir)
13
+ vendorarchdir = $(vendorlibdir)/$(sitearch)
14
+ sitedir = $(libdir)/ruby/site_ruby
15
+ pdfdir = $(docdir)
16
+ dvidir = $(docdir)
17
+ sharedstatedir = $(prefix)/com
18
+ vendordir = $(libdir)/ruby/vendor_ruby
19
+ psdir = $(docdir)
20
+ libexecdir = $(exec_prefix)/libexec
21
+ datarootdir = $(prefix)/share
22
+ bindir = $(exec_prefix)/bin
23
+ infodir = $(datarootdir)/info
24
+ sitearchdir = $(sitelibdir)/$(sitearch)
25
+ sysconfdir = $(prefix)/etc
26
+ archdir = $(rubylibdir)/$(arch)
27
+ sbindir = $(exec_prefix)/sbin
28
+ includedir = $(prefix)/include
29
+ mandir = $(datarootdir)/man
30
+ rubylibdir = $(libdir)/ruby/$(ruby_version)
31
+ localstatedir = $(prefix)/var
32
+ vendorlibdir = $(vendordir)/$(ruby_version)
33
+ sitelibdir = $(sitedir)/$(ruby_version)
34
+ docdir = $(datarootdir)/doc/$(PACKAGE)
35
+ datadir = $(datarootdir)
36
+ localedir = $(datarootdir)/locale
37
+ libdir = $(exec_prefix)/lib
38
+ oldincludedir = $(DESTDIR)/usr/include
39
+
40
+ CC = /usr/bin/gcc-4.2
41
+ LIBRUBY = $(LIBRUBY_SO)
42
+ LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
43
+ LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
44
+ LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
45
+
46
+ RUBY_EXTCONF_H =
47
+ CFLAGS = -fno-common -g -O2 -fno-common -pipe -fno-common $(cflags)
48
+ INCFLAGS = -I. -I. -I/Users/kevin/.rvm/rubies/ruby-1.8.7-p358/lib/ruby/1.8/i686-darwin11.3.0 -I.
49
+ DEFS =
50
+ CPPFLAGS = -DHAVE_USDT_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE
51
+ CXXFLAGS = $(CFLAGS)
52
+ ldflags = -L.
53
+ dldflags =
54
+ archflag =
55
+ DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
56
+ LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace
57
+ AR = ar
58
+ EXEEXT =
59
+
60
+ RUBY_INSTALL_NAME = ruby
61
+ RUBY_SO_NAME = ruby
62
+ arch = i686-darwin11.3.0
63
+ sitearch = i686-darwin11.3.0
64
+ ruby_version = 1.8
65
+ ruby = /Users/kevin/.rvm/rubies/ruby-1.8.7-p358/bin/ruby
66
+ RUBY = $(ruby)
67
+ RM = rm -f
68
+ MAKEDIRS = mkdir -p
69
+ INSTALL = /usr/bin/install -c
70
+ INSTALL_PROG = $(INSTALL) -m 0755
71
+ INSTALL_DATA = $(INSTALL) -m 644
72
+ COPY = cp
73
+
74
+ #### End of system configuration section. ####
75
+
76
+ preload =
77
+
78
+ libpath = . $(libdir)
79
+ LIBPATH = -L. -L$(libdir)
80
+ DEFFILE =
81
+
82
+ CLEANFILES = mkmf.log
83
+ DISTCLEANFILES =
84
+
85
+ extout =
86
+ extout_prefix =
87
+ target_prefix =
88
+ LOCAL_LIBS =
89
+ LIBS = $(LIBRUBYARG_SHARED) -lusdt -ldtrace -ldl -lobjc
90
+ SRCS = usdt.c
91
+ OBJS = usdt.o
92
+ TARGET = usdt
93
+ DLLIB = $(TARGET).bundle
94
+ EXTSTATIC =
95
+ STATIC_LIB =
96
+
97
+ BINDIR = $(bindir)
98
+ RUBYCOMMONDIR = $(sitedir)$(target_prefix)
99
+ RUBYLIBDIR = $(sitelibdir)$(target_prefix)
100
+ RUBYARCHDIR = $(sitearchdir)$(target_prefix)
101
+
102
+ TARGET_SO = $(DLLIB)
103
+ CLEANLIBS = $(TARGET).bundle $(TARGET).il? $(TARGET).tds $(TARGET).map
104
+ CLEANOBJS = *.o *.a *.s[ol] *.pdb *.exp *.bak
105
+
106
+ all: $(DLLIB)
107
+ static: $(STATIC_LIB)
108
+
109
+ clean:
110
+ @-$(RM) $(CLEANLIBS) $(CLEANOBJS) $(CLEANFILES)
111
+
112
+ distclean: clean
113
+ @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
114
+ @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
115
+
116
+ realclean: distclean
117
+ install: install-so install-rb
118
+
119
+ install-so: $(RUBYARCHDIR)
120
+ install-so: $(RUBYARCHDIR)/$(DLLIB)
121
+ $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
122
+ $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
123
+ install-rb: pre-install-rb install-rb-default
124
+ install-rb-default: pre-install-rb-default
125
+ pre-install-rb: Makefile
126
+ pre-install-rb-default: Makefile
127
+ $(RUBYARCHDIR):
128
+ $(MAKEDIRS) $@
129
+
130
+ site-install: site-install-so site-install-rb
131
+ site-install-so: install-so
132
+ site-install-rb: install-rb
133
+
134
+ .SUFFIXES: .c .m .cc .cxx .cpp .C .o
135
+
136
+ .cc.o:
137
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
138
+
139
+ .cxx.o:
140
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
141
+
142
+ .cpp.o:
143
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
144
+
145
+ .C.o:
146
+ $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) -c $<
147
+
148
+ .c.o:
149
+ $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) -c $<
150
+
151
+ $(DLLIB): $(OBJS) Makefile
152
+ @-$(RM) $@
153
+ $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
154
+
155
+
156
+
157
+ $(OBJS): ruby.h defines.h
@@ -0,0 +1,20 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
3
+ <plist version="1.0">
4
+ <dict>
5
+ <key>CFBundleDevelopmentRegion</key>
6
+ <string>English</string>
7
+ <key>CFBundleIdentifier</key>
8
+ <string>com.apple.xcode.dsym.conftest</string>
9
+ <key>CFBundleInfoDictionaryVersion</key>
10
+ <string>6.0</string>
11
+ <key>CFBundlePackageType</key>
12
+ <string>dSYM</string>
13
+ <key>CFBundleSignature</key>
14
+ <string>????</string>
15
+ <key>CFBundleShortVersionString</key>
16
+ <string>1.0</string>
17
+ <key>CFBundleVersion</key>
18
+ <string>1</string>
19
+ </dict>
20
+ </plist>
@@ -0,0 +1,9 @@
1
+ require 'mkmf'
2
+
3
+ have_library("dtrace", "dtrace_open", "/usr/include/dtrace.h")
4
+ system("cd ../libusdt && make")
5
+ system("cp ../libusdt/usdt.h ../libusdt/*.a ./")
6
+ have_library('usdt')
7
+ have_header('usdt.h')
8
+
9
+ create_makefile('usdt')
data/ext/usdt/test.rb ADDED
@@ -0,0 +1,23 @@
1
+ require File.expand_path(File.dirname(__FILE__)) + '/usdt'
2
+
3
+ provider = USDT::Provider.create :ruby, :test
4
+ puts provider
5
+ p = provider.probe("myfn", "probe",
6
+ :string, :string, :integer)
7
+
8
+ provider.enable
9
+
10
+ puts "run:\nsudo dtrace -n 'ruby*:test:myfn:probe { printf(\"%s %s %d\",
11
+ copyinstr(arg0),
12
+ copyinstr(arg1),
13
+ args[2])
14
+ }'"
15
+
16
+ while true
17
+ if p.enabled?
18
+ p.fire("one", "two", 3)
19
+ puts("Fired!")
20
+ end
21
+ sleep 0.5
22
+ end
23
+
data/ext/usdt/usdt.c ADDED
@@ -0,0 +1,141 @@
1
+ #include <ruby.h>
2
+ #include "usdt.h"
3
+
4
+ VALUE USDT;
5
+ VALUE USDT_Provider;
6
+ VALUE USDT_Probe;
7
+ VALUE USDT_Error;
8
+
9
+ static VALUE provider_create(VALUE self, VALUE name, VALUE mod);
10
+ static VALUE provider_probe(int argc, VALUE *argv, VALUE self);
11
+ static VALUE provider_enable(VALUE self);
12
+ static VALUE probe_enabled(VALUE self);
13
+ static VALUE probe_fire(int argc, VALUE *argv, VALUE self);
14
+
15
+ void Init_usdt() {
16
+ USDT = rb_define_module("USDT");
17
+
18
+ USDT_Error = rb_define_class_under(USDT, "Error", rb_eRuntimeError);
19
+
20
+ USDT_Provider = rb_define_class_under(USDT, "Provider", rb_cObject);
21
+ rb_define_singleton_method(USDT_Provider, "create", provider_create, 2);
22
+ rb_define_method(USDT_Provider, "probe", provider_probe, -1);
23
+ rb_define_method(USDT_Provider, "enable", provider_enable, 0);
24
+
25
+ USDT_Probe = rb_define_class_under(USDT, "Probe", rb_cObject);
26
+ rb_define_method(USDT_Probe, "enabled?", probe_enabled, 0);
27
+ rb_define_method(USDT_Probe, "fire", probe_fire, -1);
28
+ }
29
+
30
+ /**
31
+ * USDT::Provider.create :name, :modname
32
+ */
33
+ static VALUE provider_create(VALUE self, VALUE name, VALUE mod) {
34
+ Check_Type(name, T_SYMBOL);
35
+ Check_Type(mod, T_SYMBOL);
36
+
37
+ char *namestr = rb_id2name(rb_to_id(name));
38
+ char *modstr = rb_id2name(rb_to_id(mod));
39
+
40
+ usdt_provider_t* p = usdt_create_provider(namestr, modstr);
41
+
42
+ VALUE rbProvider = Data_Wrap_Struct(USDT_Provider, NULL, free, p);
43
+
44
+ if (rb_block_given_p()) {
45
+ rb_yield(rbProvider);
46
+ }
47
+
48
+ return rbProvider;
49
+ }
50
+
51
+ /**
52
+ * USDT::Provider#probe(func, name, pargs*)
53
+ */
54
+ static VALUE provider_probe(int argc, VALUE *argv, VALUE self) {
55
+ const char *func = RSTRING_PTR(argv[0]);
56
+ const char *name = RSTRING_PTR(argv[1]);
57
+ const char *types[6];
58
+ size_t i, pargc = 0;
59
+ size_t t_int = rb_intern("integer");
60
+ size_t t_str = rb_intern("string");
61
+
62
+ for (i = 0; i < 6; i++) {
63
+ if (i < argc - 2) {
64
+ Check_Type(argv[i+2], T_SYMBOL);
65
+ if (t_int == rb_to_id(argv[i+2])) {
66
+ types[i] = "int";
67
+ pargc++;
68
+ } else if (t_str == rb_to_id(argv[i+2])) {
69
+ types[i] = "char *";
70
+ pargc++;
71
+ } else {
72
+ types[i] = NULL;
73
+ }
74
+ } else {
75
+ types[i] = NULL;
76
+ }
77
+ }
78
+
79
+ usdt_provider_t *provider = DATA_PTR(self);
80
+
81
+ usdt_probedef_t **probe;
82
+ probe = ALLOC(usdt_probedef_t *);
83
+ *probe = usdt_create_probe(func, name, pargc, types);
84
+
85
+ usdt_provider_add_probe(provider, *probe);
86
+ VALUE rbProbe = Data_Wrap_Struct(USDT_Probe, NULL, free, probe);
87
+ return rbProbe;
88
+ }
89
+
90
+ /**
91
+ * USDT::Provider#enable
92
+ */
93
+ static VALUE provider_enable(VALUE self) {
94
+ usdt_provider_t *provider = DATA_PTR(self);
95
+ int status = usdt_provider_enable(provider);
96
+ if (status == 0) {
97
+ return Qtrue;
98
+ } else {
99
+ rb_raise(USDT_Error, "%s", usdt_errstr(provider));
100
+ }
101
+ }
102
+
103
+ /**
104
+ * USDT::Probe#enabled?
105
+ */
106
+ static VALUE probe_enabled(VALUE self) {
107
+ usdt_probedef_t **p = DATA_PTR(self);
108
+ usdt_probedef_t *pd = *p;
109
+
110
+ if (usdt_is_enabled(pd->probe) == 0) {
111
+ return Qfalse;
112
+ } else {
113
+ return Qtrue;
114
+ }
115
+ }
116
+
117
+ /**
118
+ * USDT::Probe#fire *args
119
+ */
120
+ static VALUE probe_fire(int argc, VALUE *argv, VALUE self) {
121
+ usdt_probedef_t **p = DATA_PTR(self);
122
+ usdt_probedef_t *probedef = *p;
123
+
124
+ void *pargs[6];
125
+ int i;
126
+
127
+ for (i = 0; i < probedef->argc; i++) {
128
+ if (probedef->types[i] == USDT_ARGTYPE_STRING) {
129
+ Check_Type(argv[i], T_STRING);
130
+ pargs[i] = (void *) RSTRING_PTR(argv[i]);
131
+ } else if (probedef->types[i] == USDT_ARGTYPE_INTEGER) {
132
+ Check_Type(argv[i], T_FIXNUM);
133
+ pargs[i] = (void *) FIX2INT(argv[i]);
134
+ } else {
135
+ pargs[i] = NULL;
136
+ }
137
+ }
138
+
139
+ usdt_fire_probe(probedef->probe, probedef->argc, pargs);
140
+ return Qtrue;
141
+ }
data/ext/usdt/usdt.h ADDED
@@ -0,0 +1,50 @@
1
+ #include <stdint.h>
2
+ #include <unistd.h>
3
+
4
+ typedef uint8_t usdt_argtype_t;
5
+ #define USDT_ARGTYPE_NONE 0
6
+ #define USDT_ARGTYPE_STRING 1
7
+ #define USDT_ARGTYPE_INTEGER 2
8
+
9
+ typedef enum usdt_error {
10
+ USDT_ERROR_MALLOC = 0,
11
+ USDT_ERROR_VALLOC,
12
+ USDT_ERROR_NOPROBES,
13
+ USDT_ERROR_LOADDOF
14
+ } usdt_error_t;
15
+
16
+ typedef struct usdt_probe {
17
+ int (*isenabled_addr)(void);
18
+ void *probe_addr;
19
+ } usdt_probe_t;
20
+
21
+ int usdt_is_enabled(usdt_probe_t *probe);
22
+ void usdt_fire_probe(usdt_probe_t *probe, size_t argc, void **argv);
23
+
24
+ typedef struct usdt_probedef {
25
+ const char *name;
26
+ const char *function;
27
+ size_t argc;
28
+ usdt_argtype_t types[6];
29
+ struct usdt_probe *probe;
30
+ struct usdt_probedef *next;
31
+ } usdt_probedef_t;
32
+
33
+ usdt_probedef_t *usdt_create_probe_varargs(const char *func, const char *name, ...);
34
+ usdt_probedef_t *usdt_create_probe(const char *func, const char *name,
35
+ size_t argc, const char **types);
36
+
37
+ typedef struct usdt_provider {
38
+ const char *name;
39
+ const char *module;
40
+ usdt_probedef_t *probedefs;
41
+ char *error;
42
+ } usdt_provider_t;
43
+
44
+ usdt_provider_t *usdt_create_provider(const char *name, const char *module);
45
+ void usdt_provider_add_probe(usdt_provider_t *provider, usdt_probedef_t *probedef);
46
+ int usdt_provider_enable(usdt_provider_t *provider);
47
+
48
+ void usdt_error(usdt_provider_t *provider, usdt_error_t error);
49
+ char *usdt_errstr(usdt_provider_t *provider);
50
+
@@ -0,0 +1,3 @@
1
+ module USDT
2
+ VERSION = '0.0.1'
3
+ end
data/lib/usdt.rb ADDED
@@ -0,0 +1,2 @@
1
+ require "usdt/version"
2
+ require 'usdt/usdt'
metadata ADDED
@@ -0,0 +1,71 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ruby-usdt
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.1
5
+ prerelease:
6
+ platform: ruby
7
+ authors:
8
+ - Kevin Chan
9
+ autorequire:
10
+ bindir: bin
11
+ cert_chain: []
12
+ date: 2012-04-20 00:00:00.000000000 Z
13
+ dependencies: []
14
+ description:
15
+ email:
16
+ - kevin@yinkei.com
17
+ executables: []
18
+ extensions:
19
+ - ext/usdt/extconf.rb
20
+ extra_rdoc_files: []
21
+ files:
22
+ - lib/usdt/version.rb
23
+ - lib/usdt.rb
24
+ - ext/libusdt/Makefile
25
+ - ext/libusdt/README
26
+ - ext/libusdt/test.pl
27
+ - ext/libusdt/test_usdt.c
28
+ - ext/libusdt/usdt.c
29
+ - ext/libusdt/usdt.h
30
+ - ext/libusdt/usdt_dof.c
31
+ - ext/libusdt/usdt_dof_file.c
32
+ - ext/libusdt/usdt_dof_sections.c
33
+ - ext/libusdt/usdt_internal.h
34
+ - ext/libusdt/usdt_probe.c
35
+ - ext/libusdt/usdt_tracepoints_i386.s
36
+ - ext/libusdt/usdt_tracepoints_x86_64.s
37
+ - ext/usdt/conftest.dSYM/Contents/Info.plist
38
+ - ext/usdt/conftest.dSYM/Contents/Resources/DWARF/conftest
39
+ - ext/usdt/extconf.rb
40
+ - ext/usdt/Makefile
41
+ - ext/usdt/test.rb
42
+ - ext/usdt/usdt.c
43
+ - ext/usdt/usdt.h
44
+ - README.md
45
+ - LICENSE.md
46
+ homepage: http://github.com/kevinykchan/ruby-usdt
47
+ licenses: []
48
+ post_install_message:
49
+ rdoc_options: []
50
+ require_paths:
51
+ - lib
52
+ - ext
53
+ required_ruby_version: !ruby/object:Gem::Requirement
54
+ none: false
55
+ requirements:
56
+ - - ! '>='
57
+ - !ruby/object:Gem::Version
58
+ version: '0'
59
+ required_rubygems_version: !ruby/object:Gem::Requirement
60
+ none: false
61
+ requirements:
62
+ - - ! '>='
63
+ - !ruby/object:Gem::Version
64
+ version: '0'
65
+ requirements: []
66
+ rubyforge_project:
67
+ rubygems_version: 1.8.21
68
+ signing_key:
69
+ specification_version: 3
70
+ summary: ruby bindings to libusdt
71
+ test_files: []