ruby-usdt 0.0.3 → 0.0.4

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,21 @@
1
+ Copyright 2012 Chris Andrews. All rights reserved.
2
+
3
+ Redistribution and use in source and binary forms, with or without modification, are
4
+ permitted provided that the following conditions are met:
5
+
6
+ 1. Redistributions of source code must retain the above copyright notice, this list of
7
+ conditions and the following disclaimer.
8
+
9
+ 2. Redistributions in binary form must reproduce the above copyright notice, this list
10
+ of conditions and the following disclaimer in the documentation and/or other materials
11
+ provided with the distribution.
12
+
13
+ THIS SOFTWARE IS PROVIDED BY CHRIS ANDREWS ``AS IS'' AND ANY EXPRESS OR IMPLIED
14
+ WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
15
+ FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL CHRIS ANDREWS OR
16
+ CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
17
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
18
+ SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
19
+ ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
20
+ NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
21
+ ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
@@ -1,3 +1,6 @@
1
+ libusdt
2
+ =======
3
+
1
4
  This is "libusdt", an extraction into a C library of the common parts
2
5
  of ruby-dtrace[1], perl-dtrace[2] and node-dtrace-provider[3].
3
6
 
@@ -19,7 +22,8 @@ the provider and indicating these stub functions as the tracepoints,
19
22
  then submitted to the kernel, creating the provider. The API then
20
23
  exposes the stubs, through which the probes may be fired.
21
24
 
22
- Status:
25
+ Status
26
+ ------
23
27
 
24
28
  The implementation here works as shown in test_usdt.c on Mac OS X,
25
29
  i386 and x86_64, on Solaris-like systems, i386 and x86_64 and on
@@ -40,7 +44,22 @@ first four arguments work reliably. See:
40
44
 
41
45
  http://wiki.freebsd.org/DTraceTODO
42
46
 
43
- To do:
47
+ See Also
48
+ --------
49
+
50
+ There are experimental Lua bindings available, which are a thin
51
+ layer over this library, and should serve as an example of typical use
52
+ as a dynamic language extension:
53
+
54
+ https://github.com/chrisa/lua-usdt
55
+
56
+ There are also Ruby bindings by Kevin Chan, replacing the provider
57
+ implementation in ruby-dtrace:
58
+
59
+ https://github.com/kevinykchan/ruby-usdt
60
+
61
+ To Do
62
+ -----
44
63
 
45
64
  Platform support:
46
65
 
@@ -53,7 +72,10 @@ Features:
53
72
  * add a "low level" API, allowing alternative provision of
54
73
  tracepoints for closer integration with language VMs.
55
74
 
75
+ * support structured types, with close integration with the host
76
+ DTrace system.
77
+
78
+
56
79
  [1] https://github.com/chrisa/ruby-dtrace
57
80
  [2] https://github.com/chrisa/perl-dtrace
58
81
  [3] https://github.com/chrisa/node-dtrace-provider
59
-
data/ext/libusdt/test.pl CHANGED
@@ -6,26 +6,36 @@ use Symbol 'gensym';
6
6
  use IO::Handle;
7
7
  use Test::More qw/ no_plan /;
8
8
 
9
+ my $USDT_ARG_MAX = 32;
10
+
9
11
  my $arch;
10
12
  if (scalar @ARGV == 1) {
11
13
  $arch = $ARGV[0];
12
14
  }
13
15
 
14
- run_tests('c', 'a');
16
+ my $user_t = ($^O eq 'solaris') ? 'uintptr_t' : 'user_addr_t';
17
+
18
+ run_tests('c', 'A');
15
19
  run_tests('i', 1);
16
20
 
17
21
  sub run_tests {
18
22
  my ($type, $start_arg) = @_;
19
23
 
20
- for my $i (0..6) {
21
- my ($status, $output) = run_dtrace('func', 'name', split(//, $type x $i));
22
- is($status, 0, 'dtrace exit status is 0');
24
+ for my $i (0..$USDT_ARG_MAX) {
25
+ my ($t_status, $d_status, $output) = run_dtrace('func', 'name', split(//, $type x $i));
26
+ is($t_status, 0, 'test exit status is 0');
27
+ is($d_status, 0, 'dtrace exit status is 0');
23
28
  like($output, qr/func:name/, 'function and name match');
24
-
29
+
25
30
  my $arg = $start_arg;
26
31
  for my $j (0..$i - 1) {
27
- like($output, qr/arg$j:'$arg'/, "type '$type' arg $j is $arg");
28
- $arg++;
32
+ like($output, qr/arg$j:'\Q$arg\E'/, "type '$type' arg $j is $arg");
33
+ if ($type eq 'i') {
34
+ $arg++;
35
+ }
36
+ else {
37
+ $arg = chr(ord($arg) + 1);
38
+ }
29
39
  }
30
40
  }
31
41
  }
@@ -39,10 +49,10 @@ sub gen_d {
39
49
  my $i = 0;
40
50
  for my $type (@types) {
41
51
  if ($type eq 'i') {
42
- $d .= "printf(\"arg$i:'%i' \", arg$i); ";
52
+ $d .= "printf(\"arg$i:'%i' \", args[$i]); ";
43
53
  }
44
54
  if ($type eq 'c') {
45
- $d .= "printf(\"arg$i:'%s' \", copyinstr(arg$i)); ";
55
+ $d .= "printf(\"arg$i:'%s' \", copyinstr(($user_t)args[$i])); ";
46
56
  }
47
57
  $i++;
48
58
  }
@@ -55,29 +65,48 @@ sub run_dtrace {
55
65
  my ($func, $name, @types) = @_;
56
66
  my $d = gen_d(@types);
57
67
 
58
- my $test;
68
+ my @t_cmd;
59
69
  if (defined $arch) {
60
- $test = "./test_usdt$arch $func $name " . (join ' ', @types);
70
+ @t_cmd = ("./test_usdt$arch", $func, $name, @types);
61
71
  }
62
72
  else {
63
- $test = "./test_usdt $func $name " . (join ' ', @types);
73
+ @t_cmd = ("./test_usdt", $func, $name, @types);
64
74
  }
65
75
 
66
- my @cmd = ('dtrace', '-Zn', $d, '-c', $test);
76
+ my ($d_wtr, $d_rdr, $d_err);
77
+ my ($t_wtr, $t_rdr, $t_err);
67
78
 
68
- my ($wtr, $rdr, $err);
69
- $err = gensym;
70
- my $pid = open3($wtr, $rdr, $err, @cmd);
79
+ $d_err = gensym;
80
+ $t_err = gensym;
71
81
 
72
- waitpid( $pid, 0 );
73
- my $status = $? >> 8;
82
+ #diag(join(' ', @t_cmd));
83
+ my $t_pid = open3($t_wtr, $t_rdr, $t_err, @t_cmd);
84
+ my $enabled = $t_rdr->getline;
74
85
 
75
- if ($status > 0) {
76
- while (!$err->eof) {
77
- print STDERR $err->getline;
78
- }
86
+ my @d_cmd = ('dtrace', '-p', $t_pid, '-n', $d);
87
+
88
+ #diag(join(' ', @d_cmd));
89
+ my $d_pid = open3($d_wtr, $d_rdr, $d_err, @d_cmd);
90
+ my $matched = $d_err->getline; # expect "matched 1 probe"
91
+
92
+ $t_wtr->print("go\n");
93
+ $t_wtr->flush;
94
+ waitpid( $t_pid, 0 );
95
+ my $t_status = $? >> 8;
96
+
97
+ my ($header, $output) = ($d_rdr->getline, $d_rdr->getline);
98
+ chomp $header;
99
+ chomp $output;
100
+ #diag("DTrace header: $header\n");
101
+ #diag("DTrace output: $output\n");
102
+ waitpid( $d_pid, 0 );
103
+
104
+ my $d_status = $? >> 8;
105
+ while (!$d_err->eof) {
106
+ my $error = $d_err->getline;
107
+ chomp $error;
108
+ #diag "DTrace error: $error";
79
109
  }
80
110
 
81
- my ($header, $output) = ($rdr->getline, $rdr->getline);
82
- return ($status, $output || '');
111
+ return ($t_status, $d_status, $output || '');
83
112
  }
@@ -1,16 +1,34 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include "usdt.h"
2
6
 
3
7
  #include <stdio.h>
4
8
  #include <stdlib.h>
5
9
  #include <string.h>
6
10
 
11
+ static void
12
+ fire_probe(usdt_probedef_t *probedef, int argc, void **argv)
13
+ {
14
+ if (usdt_is_enabled(probedef->probe)) {
15
+ usdt_fire_probe(probedef->probe, argc, argv);
16
+ }
17
+ }
18
+
7
19
  int main(int argc, char **argv) {
8
20
  usdt_provider_t *provider;
9
21
  usdt_probedef_t *probedef;
10
- char *char_argv[6] = { "a", "b", "c", "d", "e", "f" };
11
- int int_argv[6] = { 1, 2, 3, 4, 5, 6 };
22
+ char char_argv[USDT_ARG_MAX];
23
+ int int_argv[USDT_ARG_MAX * 2];
12
24
  void **args;
13
25
  int i;
26
+ char buf[255];
27
+
28
+ for (i = 0; i < USDT_ARG_MAX; i++)
29
+ int_argv[i] = i + 1;
30
+ for (i = 0; i < USDT_ARG_MAX; i++)
31
+ char_argv[i] = (char) i + 65;
14
32
 
15
33
  if (argc < 3) {
16
34
  fprintf(stderr, "usage: %s func name [types ...]\n", argv[0]);
@@ -21,10 +39,10 @@ int main(int argc, char **argv) {
21
39
  args = malloc((argc-3) * sizeof(void *));
22
40
  }
23
41
 
24
- for (i = 0; i < 6; i++) {
42
+ for (i = 0; i < USDT_ARG_MAX; i++) {
25
43
  if (argv[i+3] != NULL && i+3 < argc) {
26
44
  if (strncmp("c", argv[i+3], 1) == 0) {
27
- args[i] = (void *)char_argv[i];
45
+ args[i] = (void *)strndup(&char_argv[i], 1);
28
46
  argv[i+3] = strdup("char *");
29
47
  }
30
48
  if (strncmp("i", argv[i+3], 1) == 0) {
@@ -52,9 +70,11 @@ int main(int argc, char **argv) {
52
70
  exit (1);
53
71
  }
54
72
 
55
- if (usdt_is_enabled(probedef->probe)) {
56
- usdt_fire_probe(probedef->probe, (argc-3), (void **)args);
57
- }
73
+ fprintf(stdout, "enabled\n");
74
+ fflush(stdout);
75
+ fgets(buf, 255, stdin);
76
+
77
+ fire_probe(probedef, (argc-3), (void **)args);
58
78
 
59
79
  return 0;
60
80
  }
data/ext/libusdt/usdt.c CHANGED
@@ -1,13 +1,21 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include "usdt_internal.h"
2
6
 
3
7
  #include <stdlib.h>
4
8
  #include <stdarg.h>
9
+ #include <string.h>
10
+ #include <errno.h>
11
+ #include <stdio.h>
5
12
 
6
13
  char *usdt_errors[] = {
7
14
  "failed to allocate memory",
8
15
  "failed to allocate page-aligned memory",
9
16
  "no probes defined",
10
- "failed to load DOF"
17
+ "failed to load DOF: %s",
18
+ "provider is already enabled"
11
19
  };
12
20
 
13
21
  usdt_provider_t *
@@ -21,66 +29,33 @@ usdt_create_provider(const char *name, const char *module)
21
29
  provider->name = strdup(name);
22
30
  provider->module = strdup(module);
23
31
  provider->probedefs = NULL;
32
+ provider->enabled = 0;
24
33
 
25
34
  return provider;
26
35
  }
27
36
 
28
- usdt_probedef_t *
29
- usdt_create_probe_varargs(const char *func, const char *name, ...)
30
- {
31
- va_list ap;
32
- int i;
33
- const char *type;
34
- usdt_probedef_t *p;
35
-
36
- if ((p = malloc(sizeof *p)) == NULL)
37
- return (NULL);
38
-
39
- p->function = strdup(func);
40
- p->name = strdup(name);
41
-
42
- va_start(ap, name);
43
-
44
- for (i = 0; i < 6; i++) {
45
- if ((type = va_arg(ap, const char *)) != NULL) {
46
- if (strncmp("char *", type, 6)) {
47
- p->types[i] = USDT_ARGTYPE_STRING;
48
- }
49
- if (strncmp("int", type, 3)) {
50
- p->types[i] = USDT_ARGTYPE_INTEGER;
51
- }
52
- }
53
- else {
54
- p->types[i] = USDT_ARGTYPE_NONE;
55
- }
56
- }
57
-
58
- return (p);
59
- }
60
-
61
37
  usdt_probedef_t *
62
38
  usdt_create_probe(const char *func, const char *name, size_t argc, const char **types)
63
39
  {
64
40
  int i;
65
41
  usdt_probedef_t *p;
66
42
 
43
+ if (argc > USDT_ARG_MAX)
44
+ argc = USDT_ARG_MAX;
45
+
67
46
  if ((p = malloc(sizeof *p)) == NULL)
68
47
  return (NULL);
69
48
 
70
49
  p->function = strdup(func);
71
50
  p->name = strdup(name);
72
51
  p->argc = argc;
52
+ p->probe = NULL;
73
53
 
74
- for (i = 0; i < 6; i++) {
75
- if (i < argc && types[i] != NULL) {
76
- if (strncmp("char *", types[i], 6) == 0)
77
- p->types[i] = USDT_ARGTYPE_STRING;
78
- if (strncmp("int", types[i], 3) == 0)
79
- p->types[i] = USDT_ARGTYPE_INTEGER;
80
- }
81
- else {
82
- p->types[i] = USDT_ARGTYPE_NONE;
83
- }
54
+ for (i = 0; i < argc; i++) {
55
+ if (strncmp("char *", types[i], 6) == 0)
56
+ p->types[i] = USDT_ARGTYPE_STRING;
57
+ if (strncmp("int", types[i], 3) == 0)
58
+ p->types[i] = USDT_ARGTYPE_INTEGER;
84
59
  }
85
60
 
86
61
  return (p);
@@ -100,18 +75,6 @@ usdt_provider_add_probe(usdt_provider_t *provider, usdt_probedef_t *probedef)
100
75
  }
101
76
  }
102
77
 
103
- uint8_t
104
- usdt_probedef_argc(usdt_probedef_t *probedef)
105
- {
106
- uint8_t args = 0;
107
- uint8_t i;
108
-
109
- for (i = 0; probedef->types[i] != USDT_ARGTYPE_NONE && i < 6; i++)
110
- args++;
111
-
112
- return args;
113
- }
114
-
115
78
  int
116
79
  usdt_provider_enable(usdt_provider_t *provider)
117
80
  {
@@ -122,6 +85,11 @@ usdt_provider_enable(usdt_provider_t *provider)
122
85
  size_t size;
123
86
  usdt_dof_section_t sects[5];
124
87
 
88
+ if (provider->enabled == 1) {
89
+ usdt_error(provider, USDT_ERROR_ALREADYENABLED);
90
+ return (0); // not fatal
91
+ }
92
+
125
93
  if (provider->probedefs == NULL) {
126
94
  usdt_error(provider, USDT_ERROR_NOPROBES);
127
95
  return (-1);
@@ -166,29 +134,44 @@ usdt_provider_enable(usdt_provider_t *provider)
166
134
  usdt_dof_file_generate(file, &strtab);
167
135
 
168
136
  if ((usdt_dof_file_load(file, provider->module)) < 0) {
169
- usdt_error(provider, USDT_ERROR_LOADDOF);
137
+ usdt_error(provider, USDT_ERROR_LOADDOF, strerror(errno));
170
138
  return (-1);
171
139
  }
172
140
 
141
+ provider->enabled = 1;
173
142
  return (0);
174
143
  }
175
144
 
176
145
  int
177
146
  usdt_is_enabled(usdt_probe_t *probe)
178
147
  {
179
- return (*probe->isenabled_addr)();
148
+ if (probe != NULL)
149
+ return (*probe->isenabled_addr)();
150
+ else
151
+ return 0;
180
152
  }
181
153
 
182
154
  void
183
155
  usdt_fire_probe(usdt_probe_t *probe, size_t argc, void **nargv)
184
156
  {
185
- usdt_probe_args(probe->probe_addr, argc, nargv);
157
+ if (probe != NULL)
158
+ usdt_probe_args(probe->probe_addr, argc, nargv);
159
+ }
160
+
161
+ static void
162
+ usdt_verror(usdt_provider_t *provider, usdt_error_t error, va_list argp)
163
+ {
164
+ vasprintf(&provider->error, usdt_errors[error], argp);
186
165
  }
187
166
 
188
167
  void
189
- usdt_error(usdt_provider_t *provider, usdt_error_t error)
168
+ usdt_error(usdt_provider_t *provider, usdt_error_t error, ...)
190
169
  {
191
- provider->error = usdt_errors[error];
170
+ va_list argp;
171
+
172
+ va_start(argp, error);
173
+ usdt_verror(provider, error, argp);
174
+ va_end(argp);
192
175
  }
193
176
 
194
177
  char *
data/ext/libusdt/usdt.h CHANGED
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include <stdint.h>
2
6
  #include <unistd.h>
3
7
 
@@ -6,11 +10,14 @@ typedef uint8_t usdt_argtype_t;
6
10
  #define USDT_ARGTYPE_STRING 1
7
11
  #define USDT_ARGTYPE_INTEGER 2
8
12
 
13
+ #define USDT_ARG_MAX 32
14
+
9
15
  typedef enum usdt_error {
10
16
  USDT_ERROR_MALLOC = 0,
11
17
  USDT_ERROR_VALLOC,
12
18
  USDT_ERROR_NOPROBES,
13
- USDT_ERROR_LOADDOF
19
+ USDT_ERROR_LOADDOF,
20
+ USDT_ERROR_ALREADYENABLED
14
21
  } usdt_error_t;
15
22
 
16
23
  typedef struct usdt_probe {
@@ -25,12 +32,11 @@ typedef struct usdt_probedef {
25
32
  const char *name;
26
33
  const char *function;
27
34
  size_t argc;
28
- usdt_argtype_t types[6];
35
+ usdt_argtype_t types[USDT_ARG_MAX];
29
36
  struct usdt_probe *probe;
30
37
  struct usdt_probedef *next;
31
38
  } usdt_probedef_t;
32
39
 
33
- usdt_probedef_t *usdt_create_probe_varargs(const char *func, const char *name, ...);
34
40
  usdt_probedef_t *usdt_create_probe(const char *func, const char *name,
35
41
  size_t argc, const char **types);
36
42
 
@@ -39,12 +45,13 @@ typedef struct usdt_provider {
39
45
  const char *module;
40
46
  usdt_probedef_t *probedefs;
41
47
  char *error;
48
+ int enabled;
42
49
  } usdt_provider_t;
43
50
 
44
51
  usdt_provider_t *usdt_create_provider(const char *name, const char *module);
45
52
  void usdt_provider_add_probe(usdt_provider_t *provider, usdt_probedef_t *probedef);
46
53
  int usdt_provider_enable(usdt_provider_t *provider);
47
54
 
48
- void usdt_error(usdt_provider_t *provider, usdt_error_t error);
55
+ void usdt_error(usdt_provider_t *provider, usdt_error_t error, ...);
49
56
  char *usdt_errstr(usdt_provider_t *provider);
50
57
 
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include "usdt_internal.h"
2
6
 
3
7
  #include <stdlib.h>
@@ -26,7 +30,7 @@ usdt_provider_dof_size(usdt_provider_t *provider, usdt_strtab_t *strtab)
26
30
  size_t sections[8];
27
31
 
28
32
  for (pd = provider->probedefs; pd != NULL; pd = pd->next) {
29
- args += usdt_probedef_argc(pd);
33
+ args += pd->argc;
30
34
  probes++;
31
35
  }
32
36
 
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include "usdt_internal.h"
2
6
 
3
7
  #include <stdio.h>
@@ -154,6 +158,9 @@ usdt_dof_file_load(usdt_dof_file_t *file, const char *module)
154
158
  if ((close(fd)) < 0)
155
159
  return (-1);
156
160
 
161
+ if (file->gen < 0)
162
+ return (-1);
163
+
157
164
  return (0);
158
165
  }
159
166
 
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include "usdt_internal.h"
2
6
 
3
7
  int
@@ -17,7 +21,7 @@ usdt_dof_probes_sect(usdt_dof_section_t *probes,
17
21
  argc = 0;
18
22
  argv = 0;
19
23
 
20
- for (i = 0; pd->types[i] != USDT_ARGTYPE_NONE && i < 6; i++) {
24
+ for (i = 0; i < pd->argc; i++) {
21
25
  switch(pd->types[i]) {
22
26
  case USDT_ARGTYPE_INTEGER:
23
27
  type = usdt_strtab_add(strtab, "int");
@@ -78,7 +82,7 @@ usdt_dof_prargs_sect(usdt_dof_section_t *prargs, usdt_provider_t *provider)
78
82
  prargs->entsize = 1;
79
83
 
80
84
  for (pd = provider->probedefs; pd != NULL; pd = pd->next) {
81
- for (i = 0; pd->types[i] != USDT_ARGTYPE_NONE && i < 6; i++)
85
+ for (i = 0; i < pd->argc; i++)
82
86
  usdt_dof_section_add_data(prargs, &i, 1);
83
87
  }
84
88
  if (prargs->size == 0) {
@@ -103,7 +107,7 @@ usdt_dof_proffs_sect(usdt_dof_section_t *proffs,
103
107
  proffs->entsize = 4;
104
108
 
105
109
  for (pd = provider->probedefs; pd != NULL; pd = pd->next) {
106
- off = usdt_probe_offset(pd->probe, dof, usdt_probedef_argc(pd));
110
+ off = usdt_probe_offset(pd->probe, dof, pd->argc);
107
111
  if (usdt_dof_section_add_data(proffs, &off, 4) < 0) {
108
112
  usdt_error(provider, USDT_ERROR_MALLOC);
109
113
  return (-1);
@@ -147,21 +151,32 @@ usdt_dof_provider_sect(usdt_dof_section_t *provider_s, usdt_provider_t *provider
147
151
  p.dofpv_proffs = 3;
148
152
  p.dofpv_prenoffs = 4;
149
153
  p.dofpv_name = 1; // provider name always first strtab entry.
150
- p.dofpv_provattr = DOF_ATTR(DTRACE_STABILITY_EVOLVING,
151
- DTRACE_STABILITY_EVOLVING,
152
- DTRACE_STABILITY_EVOLVING);
153
- p.dofpv_modattr = DOF_ATTR(DTRACE_STABILITY_PRIVATE,
154
- DTRACE_STABILITY_PRIVATE,
155
- DTRACE_STABILITY_EVOLVING);
156
- p.dofpv_funcattr = DOF_ATTR(DTRACE_STABILITY_PRIVATE,
157
- DTRACE_STABILITY_PRIVATE,
158
- DTRACE_STABILITY_EVOLVING);
159
- p.dofpv_nameattr = DOF_ATTR(DTRACE_STABILITY_EVOLVING,
160
- DTRACE_STABILITY_EVOLVING,
161
- DTRACE_STABILITY_EVOLVING);
162
- p.dofpv_argsattr = DOF_ATTR(DTRACE_STABILITY_EVOLVING,
163
- DTRACE_STABILITY_EVOLVING,
164
- DTRACE_STABILITY_EVOLVING);
154
+
155
+ /*
156
+ * Stability is something of a hack. Everything is marked *
157
+ * "stable" here to permit use of the "args" array, which is *
158
+ * needed to access arguments past "arg9".
159
+ *
160
+ * It should be up to the creator of the provider to decide
161
+ * this, though, and it should be possible to set the
162
+ * appropriate stability at creation time.
163
+ */
164
+
165
+ p.dofpv_provattr = DOF_ATTR(DTRACE_STABILITY_STABLE,
166
+ DTRACE_STABILITY_STABLE,
167
+ DTRACE_STABILITY_STABLE);
168
+ p.dofpv_modattr = DOF_ATTR(DTRACE_STABILITY_STABLE,
169
+ DTRACE_STABILITY_STABLE,
170
+ DTRACE_STABILITY_STABLE);
171
+ p.dofpv_funcattr = DOF_ATTR(DTRACE_STABILITY_STABLE,
172
+ DTRACE_STABILITY_STABLE,
173
+ DTRACE_STABILITY_STABLE);
174
+ p.dofpv_nameattr = DOF_ATTR(DTRACE_STABILITY_STABLE,
175
+ DTRACE_STABILITY_STABLE,
176
+ DTRACE_STABILITY_STABLE);
177
+ p.dofpv_argsattr = DOF_ATTR(DTRACE_STABILITY_STABLE,
178
+ DTRACE_STABILITY_STABLE,
179
+ DTRACE_STABILITY_STABLE);
165
180
 
166
181
  if ((usdt_dof_section_add_data(provider_s, &p, sizeof(p))) < 0) {
167
182
  usdt_error(provider, USDT_ERROR_MALLOC);
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include <sys/dtrace.h>
2
6
  #include <sys/types.h>
3
7
  #include <sys/mman.h>
@@ -23,20 +27,10 @@ extern void usdt_tracepoint_probe(void);
23
27
  extern void usdt_tracepoint_end(void);
24
28
  extern void usdt_probe_args(void *, int, void**);
25
29
 
26
- /*
27
- typedef enum usdt_argtype {
28
- USDT_ARGTYPE_NONE = 0,
29
- USDT_ARGTYPE_STRING,
30
- USDT_ARGTYPE_INTEGER
31
- } usdt_argtype_t;
32
- */
33
-
34
30
  uint32_t usdt_probe_offset(usdt_probe_t *probe, char *dof, uint8_t argc);
35
31
  uint32_t usdt_is_enabled_offset(usdt_probe_t *probe, char *dof);
36
32
  int usdt_create_tracepoints(usdt_probe_t *probe);
37
33
 
38
- uint8_t usdt_probedef_argc(usdt_probedef_t *probedef);
39
-
40
34
  typedef struct usdt_dof_section {
41
35
  dof_secidx_t index;
42
36
  uint32_t type;
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include "usdt_internal.h"
2
6
 
3
7
  #ifdef __APPLE__
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  /*
2
6
  * Stub functions containing DTrace tracepoints for probes and
3
7
  * is-enabled probes. These functions are copied for each probe
@@ -39,7 +43,7 @@ usdt_tracepoint_end:
39
43
  _usdt_tracepoint_end:
40
44
  ret
41
45
 
42
- /*
46
+ /*
43
47
  * Probe argument marshalling, i386 style
44
48
  *
45
49
  */
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  /*
2
6
  * Stub functions containing DTrace tracepoints for probes and
3
7
  * is-enabled probes. These functions are copied for each probe
@@ -32,10 +36,11 @@ _usdt_tracepoint_probe:
32
36
  nop
33
37
  nop
34
38
  nop
35
- popq %r11
36
- popq %rbx
37
- popq %r12
38
- addq $0x18,%rsp
39
+ addq %r14,%rsp
40
+ popq %rbx
41
+ popq %r14
42
+ popq %r13
43
+ popq %r12
39
44
  leave
40
45
  usdt_tracepoint_end:
41
46
  _usdt_tracepoint_end:
@@ -50,34 +55,68 @@ usdt_probe_args:
50
55
  _usdt_probe_args:
51
56
  pushq %rbp
52
57
  movq %rsp,%rbp
53
- subq $0x18,%rsp
54
58
  pushq %r12
59
+ pushq %r13
60
+ pushq %r14
55
61
  pushq %rbx
56
- pushq %r11
62
+
57
63
  movq %rdi,%r12
58
64
  movq %rsi,%rbx
59
65
  movq %rdx,%r11
66
+ movq $0,%r14
67
+
60
68
  test %rbx,%rbx
61
69
  je fire
62
70
  movq (%r11),%rdi
63
71
  dec %rbx
64
72
  test %rbx,%rbx
65
73
  je fire
66
- movq 8(%r11),%rsi
74
+ addq $8,%r11
75
+ movq (%r11),%rsi
67
76
  dec %rbx
68
77
  test %rbx,%rbx
69
78
  je fire
70
- movq 16(%r11),%rdx
79
+ addq $8,%r11
80
+ movq (%r11),%rdx
71
81
  dec %rbx
72
82
  test %rbx,%rbx
73
83
  je fire
74
- movq 24(%r11),%rcx
84
+ addq $8,%r11
85
+ movq (%r11),%rcx
75
86
  dec %rbx
76
87
  test %rbx,%rbx
77
88
  je fire
78
- movq 32(%r11),%r8
89
+ addq $8,%r11
90
+ movq (%r11),%r8
79
91
  dec %rbx
80
92
  test %rbx,%rbx
81
93
  je fire
82
- movq 40(%r11),%r9
94
+ addq $8,%r11
95
+ movq (%r11),%r9
96
+
97
+ movq %rbx,%r13
98
+ morestack:
99
+ dec %rbx
100
+ test %rbx,%rbx
101
+ je args
102
+ subq $16,%rsp
103
+ addq $16,%r14
104
+ dec %rbx
105
+ test %rbx,%rbx
106
+ je args
107
+ jmp morestack
108
+
109
+ args:
110
+ movq %r13,%rbx
111
+ movq $0,%r13
112
+ moreargs:
113
+ dec %rbx
114
+ test %rbx,%rbx
115
+ je fire
116
+ addq $8,%r11
117
+ movq (%r11),%rax
118
+ movq %rax,(%rsp,%r13)
119
+ addq $8,%r13
120
+ jmp moreargs
121
+
83
122
  fire: jmp *%r12
data/ext/usdt/Makefile CHANGED
@@ -1,20 +1,30 @@
1
1
 
2
2
  SHELL = /bin/sh
3
3
 
4
+ # V=0 quiet, V=1 verbose. other values don't work.
5
+ V = 0
6
+ Q1 = $(V:1=)
7
+ Q = $(Q1:0=@)
8
+ n=$(NULLCMD)
9
+ ECHO1 = $(V:1=@$n)
10
+ ECHO = $(ECHO1:0=@echo)
11
+
4
12
  #### Start of system configuration section. ####
5
13
 
6
14
  srcdir = .
7
- topdir = /Users/kevin/.rvm/rubies/ruby-1.9.1-p378/include/ruby-1.9.1
8
- hdrdir = /Users/kevin/.rvm/rubies/ruby-1.9.1-p378/include/ruby-1.9.1
9
- arch_hdrdir = /Users/kevin/.rvm/rubies/ruby-1.9.1-p378/include/ruby-1.9.1/$(arch)
15
+ topdir = /Users/kevin/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1
16
+ hdrdir = /Users/kevin/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1
17
+ arch_hdrdir = /Users/kevin/.rvm/rubies/ruby-1.9.3-p125/include/ruby-1.9.1/$(arch)
10
18
  VPATH = $(srcdir):$(arch_hdrdir)/ruby:$(hdrdir)/ruby
11
- prefix = $(DESTDIR)/Users/kevin/.rvm/rubies/ruby-1.9.1-p378
19
+ prefix = $(DESTDIR)/Users/kevin/.rvm/rubies/ruby-1.9.3-p125
20
+ rubylibprefix = $(libdir)/$(RUBY_BASE_NAME)
12
21
  exec_prefix = $(prefix)
13
22
  vendorhdrdir = $(rubyhdrdir)/vendor_ruby
14
23
  sitehdrdir = $(rubyhdrdir)/site_ruby
15
- rubyhdrdir = $(includedir)/$(RUBY_INSTALL_NAME)-$(ruby_version)
16
- vendordir = $(libdir)/$(RUBY_INSTALL_NAME)/vendor_ruby
17
- sitedir = $(libdir)/$(RUBY_INSTALL_NAME)/site_ruby
24
+ rubyhdrdir = $(includedir)/$(RUBY_BASE_NAME)-$(ruby_version)
25
+ vendordir = $(rubylibprefix)/vendor_ruby
26
+ sitedir = $(rubylibprefix)/site_ruby
27
+ ridir = $(datarootdir)/$(RI_BASE_NAME)
18
28
  mandir = $(datarootdir)/man
19
29
  localedir = $(datarootdir)/locale
20
30
  libdir = $(exec_prefix)/lib
@@ -34,16 +44,18 @@ datarootdir = $(prefix)/share
34
44
  libexecdir = $(exec_prefix)/libexec
35
45
  sbindir = $(exec_prefix)/sbin
36
46
  bindir = $(exec_prefix)/bin
37
- rubylibdir = $(libdir)/$(ruby_install_name)/$(ruby_version)
47
+ rubylibdir = $(rubylibprefix)/$(ruby_version)
38
48
  archdir = $(rubylibdir)/$(arch)
39
49
  sitelibdir = $(sitedir)/$(ruby_version)
40
50
  sitearchdir = $(sitelibdir)/$(sitearch)
41
51
  vendorlibdir = $(vendordir)/$(ruby_version)
42
52
  vendorarchdir = $(vendorlibdir)/$(sitearch)
43
53
 
44
- CC = gcc
45
- CXX = g++
46
- LIBRUBY = $(LIBRUBY_A)
54
+ NULLCMD = :
55
+
56
+ CC = /usr/bin/gcc-4.2
57
+ CXX = g++-4.2
58
+ LIBRUBY = $(LIBRUBY_SO)
47
59
  LIBRUBY_A = lib$(RUBY_SO_NAME)-static.a
48
60
  LIBRUBYARG_SHARED = -l$(RUBY_SO_NAME)
49
61
  LIBRUBYARG_STATIC = -l$(RUBY_SO_NAME)-static
@@ -51,34 +63,35 @@ OUTFLAG = -o
51
63
  COUTFLAG = -o
52
64
 
53
65
  RUBY_EXTCONF_H =
54
- cflags = $(optflags) $(debugflags) $(warnflags)
55
- optflags = -O2
56
- debugflags = -g
57
- warnflags = -Wall -Wno-parentheses
58
- CFLAGS = -fno-common $(cflags) -pipe -fno-common
66
+ cflags = $(optflags) $(debugflags) $(warnflags)
67
+ optflags = -O3
68
+ debugflags = -ggdb
69
+ warnflags = -Wextra -Wno-unused-parameter -Wno-parentheses -Wno-long-long -Wno-missing-field-initializers -Wpointer-arith -Wwrite-strings -Wdeclaration-after-statement -Wshorten-64-to-32 -Wimplicit-function-declaration
70
+ CFLAGS = -fno-common $(cflags) -fno-common -pipe $(ARCH_FLAG)
59
71
  INCFLAGS = -I. -I$(arch_hdrdir) -I$(hdrdir)/ruby/backward -I$(hdrdir) -I$(srcdir)
60
72
  DEFS =
61
- CPPFLAGS = -DHAVE_USDT_H -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
62
- CXXFLAGS = $(CFLAGS) $(cxxflags)
63
- ldflags = -L.
64
- dldflags =
65
- archflag =
66
- DLDFLAGS = $(ldflags) $(dldflags) $(archflag)
67
- LDSHARED = cc -dynamic -bundle -undefined suppress -flat_namespace
68
- LDSHAREDXX = $(LDSHARED)
73
+ CPPFLAGS = -DHAVE_USDT_H -I/Users/kevin/.rvm/usr/include -D_XOPEN_SOURCE -D_DARWIN_C_SOURCE $(DEFS) $(cppflags)
74
+ CXXFLAGS = $(CFLAGS) $(cxxflags)
75
+ ldflags = -L. -L/usr/local/lib
76
+ dldflags = -Wl,-undefined,dynamic_lookup -Wl,-multiply_defined,suppress -Wl,-flat_namespace
77
+ ARCH_FLAG =
78
+ DLDFLAGS = $(ldflags) $(dldflags) $(ARCH_FLAG)
79
+ LDSHARED = $(CC) -dynamic -bundle
80
+ LDSHAREDXX = $(CXX) -dynamic -bundle
69
81
  AR = ar
70
82
  EXEEXT =
71
83
 
84
+ RUBY_BASE_NAME = ruby
72
85
  RUBY_INSTALL_NAME = ruby
73
- RUBY_SO_NAME = ruby
74
- arch = i386-darwin10.3.0
75
- sitearch = i386-darwin10.3.0
86
+ RUBY_SO_NAME = ruby.1.9.1
87
+ arch = x86_64-darwin11.3.0
88
+ sitearch = $(arch)
76
89
  ruby_version = 1.9.1
77
- ruby = /Users/kevin/.rvm/rubies/ruby-1.9.1-p378/bin/ruby
90
+ ruby = /Users/kevin/.rvm/rubies/ruby-1.9.3-p125/bin/ruby
78
91
  RUBY = $(ruby)
79
92
  RM = rm -f
80
93
  RM_RF = $(RUBY) -run -e rm -- -rf
81
- RMDIRS = $(RUBY) -run -e rmdir -- -p
94
+ RMDIRS = rmdir -p
82
95
  MAKEDIRS = mkdir -p
83
96
  INSTALL = /usr/bin/install -c
84
97
  INSTALL_PROG = $(INSTALL) -m 0755
@@ -89,8 +102,8 @@ COPY = cp
89
102
 
90
103
  preload =
91
104
 
92
- libpath = . $(libdir)
93
- LIBPATH = -L. -L$(libdir)
105
+ libpath = . $(libdir) /Users/kevin/.rvm/usr/lib
106
+ LIBPATH = -L. -L$(libdir) -L/Users/kevin/.rvm/usr/lib
94
107
  DEFFILE =
95
108
 
96
109
  CLEANFILES = mkmf.log
@@ -101,7 +114,7 @@ extout =
101
114
  extout_prefix =
102
115
  target_prefix =
103
116
  LOCAL_LIBS =
104
- LIBS = -lusdt -ldtrace -lpthread -ldl -lobjc
117
+ LIBS = $(LIBRUBYARG_SHARED) -lusdt -ldtrace -lpthread -ldl -lobjc
105
118
  SRCS = usdt.c
106
119
  OBJS = usdt.o
107
120
  TARGET = usdt
@@ -122,6 +135,8 @@ CLEANOBJS = *.o *.bak
122
135
 
123
136
  all: $(DLLIB)
124
137
  static: $(STATIC_LIB)
138
+ .PHONY: all install static install-so install-rb
139
+ .PHONY: clean clean-so clean-rb
125
140
 
126
141
  clean-rb-default::
127
142
  clean-rb::
@@ -135,7 +150,7 @@ distclean-so::
135
150
  distclean: clean distclean-so distclean-rb-default distclean-rb
136
151
  @-$(RM) Makefile $(RUBY_EXTCONF_H) conftest.* mkmf.log
137
152
  @-$(RM) core ruby$(EXEEXT) *~ $(DISTCLEANFILES)
138
- @-$(RMDIRS) $(DISTCLEANDIRS)
153
+ @-$(RMDIRS) $(DISTCLEANDIRS) 2> /dev/null || true
139
154
 
140
155
  realclean: distclean
141
156
  install: install-so install-rb
@@ -143,38 +158,55 @@ install: install-so install-rb
143
158
  install-so: $(RUBYARCHDIR)
144
159
  install-so: $(RUBYARCHDIR)/$(DLLIB)
145
160
  $(RUBYARCHDIR)/$(DLLIB): $(DLLIB)
146
- $(INSTALL_PROG) $(DLLIB) $(RUBYARCHDIR)
161
+ @-$(MAKEDIRS) $(@D)
162
+ $(INSTALL_PROG) $(DLLIB) $(@D)
147
163
  install-rb: pre-install-rb install-rb-default
148
164
  install-rb-default: pre-install-rb-default
149
165
  pre-install-rb: Makefile
150
166
  pre-install-rb-default: Makefile
167
+ pre-install-rb-default:
168
+ $(ECHO) installing default usdt libraries
151
169
  $(RUBYARCHDIR):
152
- $(MAKEDIRS) $@
170
+ $(Q) $(MAKEDIRS) $@
153
171
 
154
172
  site-install: site-install-so site-install-rb
155
173
  site-install-so: install-so
156
174
  site-install-rb: install-rb
157
175
 
158
- .SUFFIXES: .c .m .cc .cxx .cpp .C .o
176
+ .SUFFIXES: .c .m .cc .mm .cxx .cpp .C .o
159
177
 
160
178
  .cc.o:
161
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
179
+ $(ECHO) compiling $(<)
180
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
181
+
182
+ .mm.o:
183
+ $(ECHO) compiling $(<)
184
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
162
185
 
163
186
  .cxx.o:
164
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
187
+ $(ECHO) compiling $(<)
188
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
165
189
 
166
190
  .cpp.o:
167
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
191
+ $(ECHO) compiling $(<)
192
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
168
193
 
169
194
  .C.o:
170
- $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
195
+ $(ECHO) compiling $(<)
196
+ $(Q) $(CXX) $(INCFLAGS) $(CPPFLAGS) $(CXXFLAGS) $(COUTFLAG)$@ -c $<
171
197
 
172
198
  .c.o:
173
- $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
199
+ $(ECHO) compiling $(<)
200
+ $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
201
+
202
+ .m.o:
203
+ $(ECHO) compiling $(<)
204
+ $(Q) $(CC) $(INCFLAGS) $(CPPFLAGS) $(CFLAGS) $(COUTFLAG)$@ -c $<
174
205
 
175
206
  $(DLLIB): $(OBJS) Makefile
207
+ $(ECHO) linking shared-object $(DLLIB)
176
208
  @-$(RM) $(@)
177
- $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
209
+ $(Q) $(LDSHARED) -o $@ $(OBJS) $(LIBPATH) $(DLDFLAGS) $(LOCAL_LIBS) $(LIBS)
178
210
 
179
211
 
180
212
 
data/ext/usdt/usdt.h CHANGED
@@ -1,3 +1,7 @@
1
+ /*
2
+ * Copyright (c) 2012, Chris Andrews. All rights reserved.
3
+ */
4
+
1
5
  #include <stdint.h>
2
6
  #include <unistd.h>
3
7
 
@@ -6,11 +10,14 @@ typedef uint8_t usdt_argtype_t;
6
10
  #define USDT_ARGTYPE_STRING 1
7
11
  #define USDT_ARGTYPE_INTEGER 2
8
12
 
13
+ #define USDT_ARG_MAX 32
14
+
9
15
  typedef enum usdt_error {
10
16
  USDT_ERROR_MALLOC = 0,
11
17
  USDT_ERROR_VALLOC,
12
18
  USDT_ERROR_NOPROBES,
13
- USDT_ERROR_LOADDOF
19
+ USDT_ERROR_LOADDOF,
20
+ USDT_ERROR_ALREADYENABLED
14
21
  } usdt_error_t;
15
22
 
16
23
  typedef struct usdt_probe {
@@ -25,12 +32,11 @@ typedef struct usdt_probedef {
25
32
  const char *name;
26
33
  const char *function;
27
34
  size_t argc;
28
- usdt_argtype_t types[6];
35
+ usdt_argtype_t types[USDT_ARG_MAX];
29
36
  struct usdt_probe *probe;
30
37
  struct usdt_probedef *next;
31
38
  } usdt_probedef_t;
32
39
 
33
- usdt_probedef_t *usdt_create_probe_varargs(const char *func, const char *name, ...);
34
40
  usdt_probedef_t *usdt_create_probe(const char *func, const char *name,
35
41
  size_t argc, const char **types);
36
42
 
@@ -39,12 +45,13 @@ typedef struct usdt_provider {
39
45
  const char *module;
40
46
  usdt_probedef_t *probedefs;
41
47
  char *error;
48
+ int enabled;
42
49
  } usdt_provider_t;
43
50
 
44
51
  usdt_provider_t *usdt_create_provider(const char *name, const char *module);
45
52
  void usdt_provider_add_probe(usdt_provider_t *provider, usdt_probedef_t *probedef);
46
53
  int usdt_provider_enable(usdt_provider_t *provider);
47
54
 
48
- void usdt_error(usdt_provider_t *provider, usdt_error_t error);
55
+ void usdt_error(usdt_provider_t *provider, usdt_error_t error, ...);
49
56
  char *usdt_errstr(usdt_provider_t *provider);
50
57
 
data/lib/usdt/version.rb CHANGED
@@ -1,3 +1,3 @@
1
1
  module USDT
2
- VERSION = '0.0.3'
2
+ VERSION = '0.0.4'
3
3
  end
metadata CHANGED
@@ -1,37 +1,29 @@
1
- --- !ruby/object:Gem::Specification
1
+ --- !ruby/object:Gem::Specification
2
2
  name: ruby-usdt
3
- version: !ruby/object:Gem::Version
4
- hash: 25
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.0.4
5
5
  prerelease:
6
- segments:
7
- - 0
8
- - 0
9
- - 3
10
- version: 0.0.3
11
6
  platform: ruby
12
- authors:
7
+ authors:
13
8
  - Kevin Chan
14
9
  autorequire:
15
10
  bindir: bin
16
11
  cert_chain: []
17
-
18
- date: 2012-04-24 00:00:00 Z
12
+ date: 2012-05-02 00:00:00.000000000 Z
19
13
  dependencies: []
20
-
21
14
  description:
22
- email:
15
+ email:
23
16
  - kevin@yinkei.com
24
17
  executables: []
25
-
26
- extensions:
18
+ extensions:
27
19
  - ext/usdt/extconf.rb
28
20
  extra_rdoc_files: []
29
-
30
- files:
21
+ files:
31
22
  - lib/usdt/version.rb
32
23
  - lib/usdt.rb
24
+ - ext/libusdt/LICENCE
33
25
  - ext/libusdt/Makefile
34
- - ext/libusdt/README
26
+ - ext/libusdt/README.md
35
27
  - ext/libusdt/test.pl
36
28
  - ext/libusdt/test_usdt.c
37
29
  - ext/libusdt/usdt.c
@@ -52,37 +44,27 @@ files:
52
44
  - LICENSE.md
53
45
  homepage: http://github.com/kevinykchan/ruby-usdt
54
46
  licenses: []
55
-
56
47
  post_install_message:
57
48
  rdoc_options: []
58
-
59
- require_paths:
49
+ require_paths:
60
50
  - lib
61
51
  - ext
62
- required_ruby_version: !ruby/object:Gem::Requirement
52
+ required_ruby_version: !ruby/object:Gem::Requirement
63
53
  none: false
64
- requirements:
65
- - - ">="
66
- - !ruby/object:Gem::Version
67
- hash: 3
68
- segments:
69
- - 0
70
- version: "0"
71
- required_rubygems_version: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - ! '>='
56
+ - !ruby/object:Gem::Version
57
+ version: '0'
58
+ required_rubygems_version: !ruby/object:Gem::Requirement
72
59
  none: false
73
- requirements:
74
- - - ">="
75
- - !ruby/object:Gem::Version
76
- hash: 3
77
- segments:
78
- - 0
79
- version: "0"
60
+ requirements:
61
+ - - ! '>='
62
+ - !ruby/object:Gem::Version
63
+ version: '0'
80
64
  requirements: []
81
-
82
65
  rubyforge_project:
83
66
  rubygems_version: 1.8.21
84
67
  signing_key:
85
68
  specification_version: 3
86
69
  summary: Native DTrace probes for ruby.
87
70
  test_files: []
88
-