|
1 diff -rupN ruby-1.8.7-p334.orig/common.mk ruby-1.8.7-p334/common.mk |
|
2 --- ruby-1.8.7-p334.orig/common.mk 2011-04-12 15:28:51.099921336 -0700 |
|
3 +++ ruby-1.8.7-p334/common.mk 2011-04-12 15:25:22.224376846 -0700 |
|
4 @@ -55,6 +55,7 @@ OBJS = array.$(OBJEXT) \ |
|
5 string.$(OBJEXT) \ |
|
6 struct.$(OBJEXT) \ |
|
7 time.$(OBJEXT) \ |
|
8 + tracer.$(OBJEXT) \ |
|
9 util.$(OBJEXT) \ |
|
10 variable.$(OBJEXT) \ |
|
11 version.$(OBJEXT) \ |
|
12 @@ -85,9 +86,9 @@ prog: $(PROGRAM) $(WPROGRAM) |
|
13 |
|
14 miniruby$(EXEEXT): config.status $(LIBRUBY_A) $(MAINOBJ) $(MINIOBJS) $(OBJS) $(DMYEXT) |
|
15 |
|
16 -$(PROGRAM): $(LIBRUBY) $(MAINOBJ) $(OBJS) $(EXTOBJS) $(SETUP) $(PREP) |
|
17 +$(PROGRAM): $(LIBRUBY) $(MAINOBJ) $(OBJS) $(EXTOBJS) $(DTRACE_OBJS) $(SETUP) $(PREP) |
|
18 |
|
19 -$(LIBRUBY_A): $(OBJS) $(DMYEXT) $(ARCHFILE) |
|
20 +$(LIBRUBY_A): $(OBJS) $(DMYEXT) $(ARCHFILE) $(DTRACE_OBJS) |
|
21 |
|
22 $(LIBRUBY_SO): $(OBJS) $(DLDOBJS) $(LIBRUBY_A) $(PREP) $(LIBRUBY_SO_UPDATE) |
|
23 |
|
24 @@ -280,7 +281,7 @@ clear-installed-list: |
|
25 |
|
26 clean: clean-ext clean-local |
|
27 clean-local:: |
|
28 - @$(RM) $(OBJS) $(MINIOBJS) $(MAINOBJ) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES) |
|
29 + @$(RM) $(OBJS) $(DTRACE_OBJS) $(MINIOBJS) $(MAINOBJ) $(LIBRUBY_A) $(LIBRUBY_SO) $(LIBRUBY) $(LIBRUBY_ALIASES) |
|
30 @$(RM) $(PROGRAM) $(WPROGRAM) miniruby$(EXEEXT) dmyext.$(OBJEXT) $(ARCHFILE) .*.time |
|
31 @$(RM) y.tab.c y.output |
|
32 clean-ext: |
|
33 diff -rupN ruby-1.8.7-p334.orig/configure.in ruby-1.8.7-p334/configure.in |
|
34 --- ruby-1.8.7-p334.orig/configure.in 2011-04-12 15:28:51.101489810 -0700 |
|
35 +++ ruby-1.8.7-p334/configure.in 2011-04-12 15:43:06.096160692 -0700 |
|
36 @@ -524,6 +524,11 @@ AC_CHECK_HEADERS(stdlib.h string.h unist |
|
37 sys/mkdev.h sys/utime.h netinet/in_systm.h float.h ieeefp.h pthread.h \ |
|
38 ucontext.h intrinsics.h time.h) |
|
39 |
|
40 +AC_CHECK_HEADER(sys/sdt.h) |
|
41 +if test "$ac_cv_header_sys_sdt_h" == "yes"; then |
|
42 + AC_DEFINE(HAVE_SDT_H) |
|
43 +fi |
|
44 + |
|
45 dnl Check additional types. |
|
46 AC_CHECK_SIZEOF(rlim_t, 0, [ |
|
47 #ifdef HAVE_SYS_TYPES_H |
|
48 @@ -698,6 +703,18 @@ if test "$use_setreuid" = yes; then |
|
49 AC_DEFINE(USE_SETREUID) |
|
50 AC_DEFINE(USE_SETREGID) |
|
51 fi |
|
52 + |
|
53 +AC_ARG_ENABLE(dtrace, |
|
54 + [ --enable-dtrace enable DTrace support.], |
|
55 + [enable_dtrace=$enableval]) |
|
56 +if test "$enable_dtrace" == "yes" -a "$ac_cv_header_sys_sdt_h" == "yes"; then |
|
57 + AC_DEFINE(ENABLE_DTRACE) |
|
58 + DTRACE_OBJS="dtrace.o" |
|
59 +else |
|
60 + DTRACE_OBJS="" |
|
61 +fi |
|
62 +AC_SUBST(DTRACE_OBJS) |
|
63 + |
|
64 AC_STRUCT_TIMEZONE |
|
65 AC_CACHE_CHECK(for struct tm.tm_gmtoff, rb_cv_member_struct_tm_tm_gmtoff, |
|
66 [AC_TRY_COMPILE([#include <time.h>], |
|
67 diff -rupN ruby-1.8.7-p334.orig/dtrace.d ruby-1.8.7-p334/dtrace.d |
|
68 --- ruby-1.8.7-p334.orig/dtrace.d 1969-12-31 16:00:00.000000000 -0800 |
|
69 +++ ruby-1.8.7-p334/dtrace.d 2011-04-12 15:25:22.224285683 -0700 |
|
70 @@ -0,0 +1,26 @@ |
|
71 +/* -*- Mode: C -*- */ |
|
72 + |
|
73 +provider ruby { |
|
74 + probe function__entry(char*, char*, char*, int); |
|
75 + probe function__return(char*, char*, char*, int); |
|
76 + probe raise(char*, char*, int); |
|
77 + probe rescue(char*, int); |
|
78 + probe line(char*, int); |
|
79 + |
|
80 + /* gc probes */ |
|
81 + probe gc__begin(); |
|
82 + probe gc__end(); |
|
83 + |
|
84 + /* Some initial memory type probes */ |
|
85 + probe object__create__start(char*, char*, int); |
|
86 + probe object__create__done(char*, char*, int); |
|
87 + probe object__free(char*); |
|
88 + |
|
89 + probe ruby__probe(char*, char*); |
|
90 +}; |
|
91 + |
|
92 +#pragma D attributes Evolving/Evolving/Common provider ruby provider |
|
93 +#pragma D attributes Private/Private/Common provider ruby module |
|
94 +#pragma D attributes Private/Private/Common provider ruby function |
|
95 +#pragma D attributes Evolving/Evolving/Common provider ruby name |
|
96 +#pragma D attributes Evolving/Evolving/Common provider ruby args |
|
97 diff -rupN ruby-1.8.7-p334.orig/dtrace.h ruby-1.8.7-p334/dtrace.h |
|
98 --- ruby-1.8.7-p334.orig/dtrace.h 1969-12-31 16:00:00.000000000 -0800 |
|
99 +++ ruby-1.8.7-p334/dtrace.h 2011-04-12 15:25:22.224323302 -0700 |
|
100 @@ -0,0 +1,85 @@ |
|
101 +/* |
|
102 + * Generated by dtrace(1M). |
|
103 + */ |
|
104 + |
|
105 +#ifndef _DTRACE_H |
|
106 +#define _DTRACE_H |
|
107 + |
|
108 +#ifdef __cplusplus |
|
109 +extern "C" { |
|
110 +#endif |
|
111 + |
|
112 +#define RUBY_FUNCTION_ENTRY(arg0, arg1, arg2, arg3) \ |
|
113 + __dtrace_ruby___function__entry(arg0, arg1, arg2, arg3) |
|
114 +#define RUBY_FUNCTION_ENTRY_ENABLED() \ |
|
115 + __dtraceenabled_ruby___function__entry() |
|
116 +#define RUBY_FUNCTION_RETURN(arg0, arg1, arg2, arg3) \ |
|
117 + __dtrace_ruby___function__return(arg0, arg1, arg2, arg3) |
|
118 +#define RUBY_FUNCTION_RETURN_ENABLED() \ |
|
119 + __dtraceenabled_ruby___function__return() |
|
120 +#define RUBY_GC_BEGIN() \ |
|
121 + __dtrace_ruby___gc__begin() |
|
122 +#define RUBY_GC_BEGIN_ENABLED() \ |
|
123 + __dtraceenabled_ruby___gc__begin() |
|
124 +#define RUBY_GC_END() \ |
|
125 + __dtrace_ruby___gc__end() |
|
126 +#define RUBY_GC_END_ENABLED() \ |
|
127 + __dtraceenabled_ruby___gc__end() |
|
128 +#define RUBY_LINE(arg0, arg1) \ |
|
129 + __dtrace_ruby___line(arg0, arg1) |
|
130 +#define RUBY_LINE_ENABLED() \ |
|
131 + __dtraceenabled_ruby___line() |
|
132 +#define RUBY_OBJECT_CREATE_DONE(arg0, arg1, arg2) \ |
|
133 + __dtrace_ruby___object__create__done(arg0, arg1, arg2) |
|
134 +#define RUBY_OBJECT_CREATE_DONE_ENABLED() \ |
|
135 + __dtraceenabled_ruby___object__create__done() |
|
136 +#define RUBY_OBJECT_CREATE_START(arg0, arg1, arg2) \ |
|
137 + __dtrace_ruby___object__create__start(arg0, arg1, arg2) |
|
138 +#define RUBY_OBJECT_CREATE_START_ENABLED() \ |
|
139 + __dtraceenabled_ruby___object__create__start() |
|
140 +#define RUBY_OBJECT_FREE(arg0) \ |
|
141 + __dtrace_ruby___object__free(arg0) |
|
142 +#define RUBY_OBJECT_FREE_ENABLED() \ |
|
143 + __dtraceenabled_ruby___object__free() |
|
144 +#define RUBY_RAISE(arg0, arg1, arg2) \ |
|
145 + __dtrace_ruby___raise(arg0, arg1, arg2) |
|
146 +#define RUBY_RAISE_ENABLED() \ |
|
147 + __dtraceenabled_ruby___raise() |
|
148 +#define RUBY_RESCUE(arg0, arg1) \ |
|
149 + __dtrace_ruby___rescue(arg0, arg1) |
|
150 +#define RUBY_RESCUE_ENABLED() \ |
|
151 + __dtraceenabled_ruby___rescue() |
|
152 +#define RUBY_RUBY_PROBE(arg0, arg1) \ |
|
153 + __dtrace_ruby___ruby__probe(arg0, arg1) |
|
154 +#define RUBY_RUBY_PROBE_ENABLED() \ |
|
155 + __dtraceenabled_ruby___ruby__probe() |
|
156 + |
|
157 + |
|
158 +extern void __dtrace_ruby___function__entry(char *, char *, char *, int); |
|
159 +extern int __dtraceenabled_ruby___function__entry(void); |
|
160 +extern void __dtrace_ruby___function__return(char *, char *, char *, int); |
|
161 +extern int __dtraceenabled_ruby___function__return(void); |
|
162 +extern void __dtrace_ruby___gc__begin(void); |
|
163 +extern int __dtraceenabled_ruby___gc__begin(void); |
|
164 +extern void __dtrace_ruby___gc__end(void); |
|
165 +extern int __dtraceenabled_ruby___gc__end(void); |
|
166 +extern void __dtrace_ruby___line(char *, int); |
|
167 +extern int __dtraceenabled_ruby___line(void); |
|
168 +extern void __dtrace_ruby___object__create__done(char *, char *, int); |
|
169 +extern int __dtraceenabled_ruby___object__create__done(void); |
|
170 +extern void __dtrace_ruby___object__create__start(char *, char *, int); |
|
171 +extern int __dtraceenabled_ruby___object__create__start(void); |
|
172 +extern void __dtrace_ruby___object__free(char *); |
|
173 +extern int __dtraceenabled_ruby___object__free(void); |
|
174 +extern void __dtrace_ruby___raise(char *, char *, int); |
|
175 +extern int __dtraceenabled_ruby___raise(void); |
|
176 +extern void __dtrace_ruby___rescue(char *, int); |
|
177 +extern int __dtraceenabled_ruby___rescue(void); |
|
178 +extern void __dtrace_ruby___ruby__probe(char *, char *); |
|
179 +extern int __dtraceenabled_ruby___ruby__probe(void); |
|
180 + |
|
181 +#ifdef __cplusplus |
|
182 +} |
|
183 +#endif |
|
184 + |
|
185 +#endif /* _DTRACE_H */ |
|
186 diff -rupN ruby-1.8.7-p334.orig/eval.c ruby-1.8.7-p334/eval.c |
|
187 --- ruby-1.8.7-p334.orig/eval.c 2011-04-12 15:28:51.209420258 -0700 |
|
188 +++ ruby-1.8.7-p334/eval.c 2011-04-12 15:25:22.224969993 -0700 |
|
189 @@ -226,6 +226,10 @@ int _setjmp(), _longjmp(); |
|
190 |
|
191 #include <sys/stat.h> |
|
192 |
|
193 +#ifdef ENABLE_DTRACE |
|
194 +#include "dtrace.h" |
|
195 +#endif |
|
196 + |
|
197 VALUE rb_cProc; |
|
198 VALUE rb_cBinding; |
|
199 static VALUE proc_invoke _((VALUE,VALUE,VALUE,VALUE)); |
|
200 @@ -3059,12 +3063,22 @@ rb_eval(self, n) |
|
201 |
|
202 case NODE_IF: |
|
203 if (RTEST(rb_eval(self, node->nd_cond))) { |
|
204 + #ifdef ENABLE_DTRACE |
|
205 + if (RUBY_LINE_ENABLED()) |
|
206 + if (ruby_current_node && ruby_current_node->nd_file) |
|
207 + RUBY_LINE(ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
208 + #endif |
|
209 EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self, |
|
210 ruby_frame->last_func, |
|
211 ruby_frame->last_class); |
|
212 node = node->nd_body; |
|
213 } |
|
214 else { |
|
215 + #ifdef ENABLE_DTRACE |
|
216 + if (RUBY_LINE_ENABLED()) |
|
217 + if (ruby_current_node && ruby_current_node->nd_file) |
|
218 + RUBY_LINE(ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
219 + #endif |
|
220 EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self, |
|
221 ruby_frame->last_func, |
|
222 ruby_frame->last_class); |
|
223 @@ -3079,6 +3093,11 @@ rb_eval(self, n) |
|
224 if (nd_type(node) != NODE_WHEN) goto again; |
|
225 tag = node->nd_head; |
|
226 while (tag) { |
|
227 + #ifdef ENABLE_DTRACE |
|
228 + if (RUBY_LINE_ENABLED()) |
|
229 + if (ruby_current_node && ruby_current_node->nd_file) |
|
230 + RUBY_LINE(ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
231 + #endif |
|
232 EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self, |
|
233 ruby_frame->last_func, |
|
234 ruby_frame->last_class); |
|
235 @@ -3120,6 +3139,11 @@ rb_eval(self, n) |
|
236 } |
|
237 tag = node->nd_head; |
|
238 while (tag) { |
|
239 + #ifdef ENABLE_DTRACE |
|
240 + if (RUBY_LINE_ENABLED()) |
|
241 + if (ruby_current_node && ruby_current_node->nd_file) |
|
242 + RUBY_LINE(ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
243 + #endif |
|
244 EXEC_EVENT_HOOK(RUBY_EVENT_LINE, tag, self, |
|
245 ruby_frame->last_func, |
|
246 ruby_frame->last_class); |
|
247 @@ -3340,6 +3364,11 @@ rb_eval(self, n) |
|
248 rescuing = -1; |
|
249 while (resq) { |
|
250 ruby_current_node = resq; |
|
251 + #ifdef ENABLE_DTRACE |
|
252 + if (RUBY_RESCUE_ENABLED()) |
|
253 + if (ruby_current_node && ruby_current_node->nd_file) |
|
254 + RUBY_RESCUE(ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
255 + #endif |
|
256 if (handle_rescue(self, resq)) { |
|
257 state = 0; |
|
258 rescuing = 1; |
|
259 @@ -4160,6 +4189,11 @@ rb_eval(self, n) |
|
260 break; |
|
261 |
|
262 case NODE_NEWLINE: |
|
263 + #ifdef ENABLE_DTRACE |
|
264 + if (RUBY_LINE_ENABLED()) |
|
265 + if (ruby_current_node && ruby_current_node->nd_file) |
|
266 + RUBY_LINE(ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
267 + #endif |
|
268 EXEC_EVENT_HOOK(RUBY_EVENT_LINE, node, self, |
|
269 ruby_frame->last_func, |
|
270 ruby_frame->last_class); |
|
271 @@ -4638,6 +4672,10 @@ rb_longjmp(tag, mesg) |
|
272 |
|
273 rb_trap_restore_mask(); |
|
274 if (tag != TAG_FATAL) { |
|
275 + #ifdef ENABLE_DTRACE |
|
276 + if (RUBY_RAISE_ENABLED()) |
|
277 + RUBY_RAISE(rb_obj_classname(ruby_errinfo), ruby_sourcefile, ruby_sourceline); |
|
278 + #endif |
|
279 EXEC_EVENT_HOOK(RUBY_EVENT_RAISE, ruby_current_node, |
|
280 ruby_frame->self, |
|
281 ruby_frame->last_func, |
|
282 @@ -5909,6 +5947,13 @@ rb_call0(klass, recv, id, oid, argc, arg |
|
283 rb_bug("bad argc (%d) specified for `%s(%s)'", |
|
284 len, rb_class2name(klass), rb_id2name(id)); |
|
285 } |
|
286 + #ifdef ENABLE_DTRACE |
|
287 + if (RUBY_FUNCTION_ENTRY_ENABLED()) { |
|
288 + char *classname = rb_class2name(klass), *methodname = rb_id2name(id); |
|
289 + if (ruby_current_node && ruby_current_node->nd_file && classname && methodname) |
|
290 + RUBY_FUNCTION_ENTRY(classname, methodname, ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
291 + } |
|
292 + #endif |
|
293 if (event_hooks) { |
|
294 int state; |
|
295 |
|
296 @@ -5927,6 +5972,13 @@ rb_call0(klass, recv, id, oid, argc, arg |
|
297 else { |
|
298 result = call_cfunc(body->nd_cfnc, recv, len, argc, argv); |
|
299 } |
|
300 + #ifdef ENABLE_DTRACE |
|
301 + if (RUBY_FUNCTION_RETURN_ENABLED()) { |
|
302 + char *classname = rb_class2name(klass), *methodname = rb_id2name(id); |
|
303 + if (ruby_current_node && ruby_current_node->nd_file && classname && methodname) |
|
304 + RUBY_FUNCTION_RETURN(classname, methodname, ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
305 + } |
|
306 + #endif |
|
307 } |
|
308 break; |
|
309 |
|
310 @@ -5954,12 +6006,26 @@ rb_call0(klass, recv, id, oid, argc, arg |
|
311 |
|
312 case NODE_BMETHOD: |
|
313 ruby_frame->flags |= FRAME_DMETH; |
|
314 + #ifdef ENABLE_DTRACE |
|
315 + if (RUBY_FUNCTION_ENTRY_ENABLED()) { |
|
316 + char *classname = rb_class2name(klass), *methodname = rb_id2name(id); |
|
317 + if (ruby_current_node && ruby_current_node->nd_file && classname && methodname) |
|
318 + RUBY_FUNCTION_ENTRY(classname, methodname, ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
319 + } |
|
320 + #endif |
|
321 if (event_hooks) { |
|
322 struct BLOCK *data; |
|
323 Data_Get_Struct(body->nd_cval, struct BLOCK, data); |
|
324 EXEC_EVENT_HOOK(RUBY_EVENT_CALL, data->body, recv, id, klass); |
|
325 } |
|
326 result = proc_invoke(body->nd_cval, rb_ary_new4(argc, argv), recv, klass); |
|
327 + #ifdef ENABLE_DTRACE |
|
328 + if (RUBY_FUNCTION_RETURN_ENABLED()) { |
|
329 + char *classname = rb_class2name(klass), *methodname = rb_id2name(id); |
|
330 + if (ruby_current_node && ruby_current_node->nd_file && classname && methodname) |
|
331 + RUBY_FUNCTION_RETURN(classname, methodname, ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
332 + } |
|
333 + #endif |
|
334 if (event_hooks) { |
|
335 EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node, recv, id, klass); |
|
336 } |
|
337 @@ -6073,6 +6139,13 @@ rb_call0(klass, recv, id, oid, argc, arg |
|
338 } |
|
339 ruby_frame->argc = i; |
|
340 } |
|
341 + #ifdef ENABLE_DTRACE |
|
342 + if (RUBY_FUNCTION_ENTRY_ENABLED()) { |
|
343 + char *classname = rb_class2name(klass), *methodname = rb_id2name(id); |
|
344 + if (ruby_current_node && ruby_current_node->nd_file && classname && methodname) |
|
345 + RUBY_FUNCTION_ENTRY(classname, methodname, ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
346 + } |
|
347 + #endif |
|
348 if (event_hooks) { |
|
349 EXEC_EVENT_HOOK(RUBY_EVENT_CALL, b2, recv, id, klass); |
|
350 } |
|
351 @@ -6083,6 +6156,13 @@ rb_call0(klass, recv, id, oid, argc, arg |
|
352 state = 0; |
|
353 } |
|
354 POP_TAG(); |
|
355 + #ifdef ENABLE_DTRACE |
|
356 + if (RUBY_FUNCTION_RETURN_ENABLED()) { |
|
357 + char *classname = rb_class2name(klass), *methodname = rb_id2name(id); |
|
358 + if (ruby_current_node && ruby_current_node->nd_file && classname && methodname) |
|
359 + RUBY_FUNCTION_RETURN(classname, methodname, ruby_current_node->nd_file, nd_line(ruby_current_node)); |
|
360 + } |
|
361 + #endif |
|
362 if (event_hooks) { |
|
363 EXEC_EVENT_HOOK(RUBY_EVENT_RETURN, ruby_current_node, recv, id, klass); |
|
364 } |
|
365 diff -rupN ruby-1.8.7-p334.orig/gc.c ruby-1.8.7-p334/gc.c |
|
366 --- ruby-1.8.7-p334.orig/gc.c 2011-04-12 15:28:51.239680123 -0700 |
|
367 +++ ruby-1.8.7-p334/gc.c 2011-04-12 15:25:22.225120360 -0700 |
|
368 @@ -30,6 +30,11 @@ |
|
369 #include <sys/resource.h> |
|
370 #endif |
|
371 |
|
372 +#ifdef ENABLE_DTRACE |
|
373 +#include <sys/sdt.h> |
|
374 +#include "dtrace.h" |
|
375 +#endif |
|
376 + |
|
377 #if defined _WIN32 || defined __CYGWIN__ |
|
378 #include <windows.h> |
|
379 #endif |
|
380 @@ -1264,6 +1269,11 @@ obj_free(obj) |
|
381 break; |
|
382 } |
|
383 |
|
384 + #ifdef ENABLE_DTRACE |
|
385 + if (RUBY_OBJECT_FREE_ENABLED()) |
|
386 + RUBY_OBJECT_FREE(rb_class2name(CLASS_OF(obj))); |
|
387 + #endif |
|
388 + |
|
389 if (FL_TEST(obj, FL_EXIVAR)) { |
|
390 rb_free_generic_ivar((VALUE)obj); |
|
391 } |
|
392 @@ -1430,6 +1440,12 @@ garbage_collect() |
|
393 { |
|
394 struct gc_list *list; |
|
395 struct FRAME * volatile frame; /* gcc 2.7.2.3 -O2 bug?? */ |
|
396 + |
|
397 + #ifdef ENABLE_DTRACE |
|
398 + if (RUBY_GC_BEGIN_ENABLED()) |
|
399 + RUBY_GC_BEGIN(); |
|
400 + #endif |
|
401 + |
|
402 jmp_buf save_regs_gc_mark; |
|
403 SET_STACK_END; |
|
404 |
|
405 @@ -1522,6 +1538,11 @@ garbage_collect() |
|
406 } while (!MARK_STACK_EMPTY); |
|
407 |
|
408 gc_sweep(); |
|
409 + |
|
410 + #ifdef ENABLE_DTRACE |
|
411 + if (RUBY_GC_END_ENABLED()) |
|
412 + RUBY_GC_END(); |
|
413 + #endif |
|
414 } |
|
415 |
|
416 void |
|
417 diff -rupN ruby-1.8.7-p334.orig/inits.c ruby-1.8.7-p334/inits.c |
|
418 --- ruby-1.8.7-p334.orig/inits.c 2011-04-12 15:28:51.287011653 -0700 |
|
419 +++ ruby-1.8.7-p334/inits.c 2011-04-12 14:50:21.714050708 -0700 |
|
420 @@ -46,6 +46,7 @@ void Init_Struct _((void)); |
|
421 void Init_Time _((void)); |
|
422 void Init_var_tables _((void)); |
|
423 void Init_version _((void)); |
|
424 +void Init_Tracer _((void)); |
|
425 |
|
426 void |
|
427 rb_call_inits() |
|
428 @@ -83,4 +84,5 @@ rb_call_inits() |
|
429 Init_Enumerator(); |
|
430 Init_marshal(); |
|
431 Init_version(); |
|
432 + Init_Tracer(); |
|
433 } |
|
434 diff -rupN ruby-1.8.7-p334.orig/Makefile.in ruby-1.8.7-p334/Makefile.in |
|
435 --- ruby-1.8.7-p334.orig/Makefile.in 2011-04-12 15:27:29.001372251 -0700 |
|
436 +++ ruby-1.8.7-p334/Makefile.in 2011-04-12 15:33:29.186318522 -0700 |
|
437 @@ -88,6 +88,7 @@ ASFLAGS = @ASFLAGS@ |
|
438 |
|
439 OBJEXT = @OBJEXT@ |
|
440 MANTYPE = @MANTYPE@ |
|
441 +DTRACE_OBJS = @DTRACE_OBJS@ |
|
442 |
|
443 INSTALLED_LIST= .installed.list |
|
444 #### End of variables |
|
445 @@ -103,11 +104,11 @@ all: |
|
446 |
|
447 miniruby$(EXEEXT): |
|
448 @$(RM) $@ |
|
449 - $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(MINIOBJS) $(LIBRUBY_A) $(LIBS) $(OUTFLAG)$@ |
|
450 + $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(MINIOBJS) $(LIBRUBY_A) $(DTRACE_OBJS) $(LIBS) $(OUTFLAG)$@ |
|
451 |
|
452 $(PROGRAM): |
|
453 @$(RM) $@ |
|
454 - $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) $(LIBRUBYARG) $(LIBS) $(OUTFLAG)$@ |
|
455 + $(PURIFY) $(CC) $(LDFLAGS) $(XLDFLAGS) $(MAINLIBS) $(MAINOBJ) $(EXTOBJS) $(DTRACE_OBJS) gc.o eval.o tracer.o $(LIBRUBYARG) $(LIBS) $(OUTFLAG)$@ |
|
456 |
|
457 # We must `rm' the library each time this rule is invoked because "updating" a |
|
458 # MAB library on Apple/NeXT (see --enable-fat-binary in configure) is not |
|
459 @@ -119,7 +120,7 @@ $(LIBRUBY_A): |
|
460 |
|
461 $(LIBRUBY_SO): |
|
462 @-$(PRE_LIBRUBY_UPDATE) |
|
463 - $(LDSHARED) $(DLDFLAGS) $(OBJS) $(DLDOBJS) $(SOLIBS) $(OUTFLAG)$@ |
|
464 + $(LDSHARED) $(DLDFLAGS) $(OBJS) $(DLDOBJS) $(DTRACE_OBJS) $(SOLIBS) $(OUTFLAG)$@ |
|
465 @-$(MINIRUBY) -e 'ARGV.each{|link| File.delete link if File.exist? link; \ |
|
466 File.symlink "$(LIBRUBY_SO)", link}' \ |
|
467 $(LIBRUBY_ALIASES) || true |
|
468 @@ -194,6 +195,9 @@ distclean-local:: |
|
469 ext/extinit.$(OBJEXT): ext/extinit.c $(SETUP) |
|
470 $(CC) $(CFLAGS) $(XCFLAGS) $(CPPFLAGS) $(OUTFLAG)$@ -c ext/extinit.c |
|
471 |
|
472 +dtrace.@OBJEXT@: dtrace.d $(OBJS) $(MAINOBJ) |
|
473 + /usr/sbin/dtrace -G -o $@ -s dtrace.d $(OBJS) |
|
474 + |
|
475 update-rubyspec: |
|
476 if [ -d $(srcdir)/rubyspec ]; then \ |
|
477 cd $(srcdir)/rubyspec/mspec; \ |
|
478 diff -rupN ruby-1.8.7-p334.orig/object.c ruby-1.8.7-p334/object.c |
|
479 --- ruby-1.8.7-p334.orig/object.c 2011-04-12 15:28:51.288940374 -0700 |
|
480 +++ ruby-1.8.7-p334/object.c 2011-04-12 15:25:22.224228022 -0700 |
|
481 @@ -20,6 +20,12 @@ |
|
482 #include <ctype.h> |
|
483 #include <math.h> |
|
484 |
|
485 +#ifdef ENABLE_DTRACE |
|
486 +#include "dtrace.h" |
|
487 +#include "node.h" |
|
488 +NODE* ruby_current_node; |
|
489 +#endif |
|
490 + |
|
491 VALUE rb_mKernel; |
|
492 VALUE rb_cObject; |
|
493 VALUE rb_cModule; |
|
494 @@ -1603,7 +1609,25 @@ rb_obj_alloc(klass) |
|
495 if (FL_TEST(klass, FL_SINGLETON)) { |
|
496 rb_raise(rb_eTypeError, "can't create instance of virtual class"); |
|
497 } |
|
498 + |
|
499 + #ifdef ENABLE_DTRACE |
|
500 + if (RUBY_OBJECT_CREATE_START_ENABLED()) { |
|
501 + char *file = ruby_current_node == NULL ? "" : ruby_current_node->nd_file; |
|
502 + int line = ruby_current_node == NULL ? 0 : nd_line(ruby_current_node); |
|
503 + RUBY_OBJECT_CREATE_START(rb_class2name(klass), file, line); |
|
504 + } |
|
505 + #endif |
|
506 + |
|
507 obj = rb_funcall(klass, ID_ALLOCATOR, 0, 0); |
|
508 + |
|
509 + #ifdef ENABLE_DTRACE |
|
510 + if (RUBY_OBJECT_CREATE_DONE_ENABLED()) { |
|
511 + char *file = ruby_current_node == NULL ? "" : ruby_current_node->nd_file; |
|
512 + int line = ruby_current_node == NULL ? 0 : nd_line(ruby_current_node); |
|
513 + RUBY_OBJECT_CREATE_DONE(rb_class2name(klass), file, line); |
|
514 + } |
|
515 + #endif |
|
516 + |
|
517 if (rb_obj_class(obj) != rb_class_real(klass)) { |
|
518 rb_raise(rb_eTypeError, "wrong instance allocation"); |
|
519 } |
|
520 diff -rupN ruby-1.8.7-p334.orig/tracer.c ruby-1.8.7-p334/tracer.c |
|
521 --- ruby-1.8.7-p334.orig/tracer.c 1969-12-31 16:00:00.000000000 -0800 |
|
522 +++ ruby-1.8.7-p334/tracer.c 2011-04-12 14:53:16.013377766 -0700 |
|
523 @@ -0,0 +1,64 @@ |
|
524 +#include "ruby.h" |
|
525 + |
|
526 +#ifdef ENABLE_DTRACE |
|
527 +#include "dtrace.h" |
|
528 +#endif |
|
529 + |
|
530 +VALUE rb_mDtrace; |
|
531 + |
|
532 +static VALUE |
|
533 +ruby_dtrace_fire(argc, argv, klass) |
|
534 + int argc; |
|
535 + VALUE *argv; |
|
536 + VALUE klass; |
|
537 +{ |
|
538 + int args; |
|
539 + VALUE name, data, ret; |
|
540 + char *probe_data; |
|
541 + char *probe_name; |
|
542 + char *start_probe; |
|
543 + char *end_probe; |
|
544 + |
|
545 + #ifdef ENABLE_DTRACE |
|
546 + |
|
547 + args = rb_scan_args(argc, argv, "11", &name, &data); |
|
548 + probe_data = args == 2 ? StringValuePtr(data) : ""; |
|
549 + probe_name = StringValuePtr(name); |
|
550 + |
|
551 + if (rb_block_given_p()) { |
|
552 + start_probe = malloc(strlen(probe_name) + 7); |
|
553 + end_probe = malloc(strlen(probe_name) + 5); |
|
554 + |
|
555 + sprintf(start_probe, "%s-start", probe_name); |
|
556 + sprintf(end_probe, "%s-end", probe_name); |
|
557 + |
|
558 + /* Build -start and -end strings for probe names */ |
|
559 + if (RUBY_RUBY_PROBE_ENABLED()) |
|
560 + RUBY_RUBY_PROBE(start_probe, probe_data); |
|
561 + #endif |
|
562 + |
|
563 + ret = rb_yield(Qnil); |
|
564 + |
|
565 + #if ENABLE_DTRACE |
|
566 + |
|
567 + if (RUBY_RUBY_PROBE_ENABLED()) |
|
568 + RUBY_RUBY_PROBE(end_probe, probe_data); |
|
569 + |
|
570 + free(start_probe); |
|
571 + free(end_probe); |
|
572 + } else { |
|
573 + if (RUBY_RUBY_PROBE_ENABLED()) |
|
574 + RUBY_RUBY_PROBE(probe_name, probe_data); |
|
575 + ret = Qnil; |
|
576 + } |
|
577 + #endif |
|
578 + return ret; |
|
579 +} |
|
580 + |
|
581 + |
|
582 +void Init_Tracer() |
|
583 +{ |
|
584 + rb_mDtrace = rb_define_module("DTracer"); |
|
585 + rb_define_module_function(rb_mDtrace, "fire", ruby_dtrace_fire, -1); |
|
586 +} |
|
587 + |