]> granicus.if.org Git - php/commitdiff
Add object-create and object-destroy dtrace probe
authorDavid Soria Parra <dsp@php.net>
Mon, 16 Nov 2009 03:10:25 +0000 (03:10 +0000)
committerDavid Soria Parra <dsp@php.net>
Mon, 16 Nov 2009 03:10:25 +0000 (03:10 +0000)
Zend/zend_API.c
Zend/zend_dtrace.c
Zend/zend_dtrace.d
Zend/zend_dtrace.h
Zend/zend_objects.c
configure.in

index 9a018cffd59e6d0ded1e8b4a882786e05505ee89..d291fca97ba59759a6cd30869f198668d584a2f7 100644 (file)
@@ -27,6 +27,7 @@
 #include "zend_constants.h"
 #include "zend_exceptions.h"
 #include "zend_closures.h"
+#include "zend_dtrace.h"
 
 #ifdef HAVE_STDARG_H
 #include <stdarg.h>
@@ -1351,6 +1352,23 @@ ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *class_type
                zend_error(E_ERROR, "Cannot instantiate %s %v", what, class_type->name);
        }
 
+#ifdef HAVE_DTRACE
+       if (DTRACE_OBJECT_CREATE_ENABLED()) {
+               char *s_classname, *filename;
+               int s_classname_len, lineno;
+
+               filename = dtrace_get_executed_filename(TSRMLS_C);
+               lineno = zend_get_executed_lineno(TSRMLS_C);
+               if (u_strlen(class_type->name.u) > 0) {
+                       zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, class_type->name.u, u_strlen(class_type->name.u) TSRMLS_CC);
+               }
+               DTRACE_OBJECT_CREATE(s_classname, filename, lineno);
+               if (s_classname != NULL) {
+                       efree(s_classname);
+               }
+       }
+#endif /* HAVE_DTRACE */
+
        zend_update_class_constants(class_type TSRMLS_CC);
 
        Z_TYPE_P(arg) = IS_OBJECT;
index d00dd970e0ee122050eee9f61b58923e390ff5dd..4b074d5f8fda92df75ce505591d41252b6f1a795 100644 (file)
@@ -24,7 +24,7 @@
 
 #ifdef HAVE_DTRACE
 /* PHP DTrace probes {{{ */
-static inline char *dtrace_get_executed_filename(TSRMLS_D)
+ZEND_API char *dtrace_get_executed_filename(TSRMLS_D)
 {
        if (EG(current_execute_data) && EG(current_execute_data)->op_array) {
                return EG(current_execute_data)->op_array->filename;
index 9b8f36518ea11a25a82f09c711d820ebb6102406..4f9059d1912ddcdbdb0442c6cdb29baec4a1d081 100644 (file)
@@ -30,6 +30,8 @@ provider php {
        probe execute__return(char* request_file, int lineno);
        probe function__entry(char* function_name, char* request_file, int lineno, char* classname, char* scope);
        probe function__return(char* function_name, char* request_file, int lineno, char* classname, char* scope);
+       probe object__create(char *classname, char* request_file, int lineno);
+       probe object__destroy(char *classname, char* request_file, int lineno);
 };
 
 #pragma D attributes Evolving/Evolving/Common provider php provider
index 65d19ef346a85f3f8eef48325493f18167ee4b4e..9d8219ba140247d7ac8d2260bb20b860b2aed1c5 100644 (file)
@@ -37,6 +37,7 @@ ZEND_API void (*zend_dtrace_execute_internal)(zend_execute_data *execute_data_pt
 ZEND_API zend_op_array *dtrace_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC);
 ZEND_API void dtrace_execute(zend_op_array *op_array TSRMLS_DC);
 ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC);
+ZEND_API char *dtrace_get_executed_filename(TSRMLS_D);
 #include <zend_dtrace_gen.h>
 
 #endif /* HAVE_DTRACE */
index d6699a8589ac3ee6f5898df9a2a258ab246aef09..4f5d48914195c00e9fc42ce7a30eace21c4a0cba 100644 (file)
@@ -25,6 +25,7 @@
 #include "zend_API.h"
 #include "zend_interfaces.h"
 #include "zend_exceptions.h"
+#include "zend_dtrace.h"
 
 ZEND_API void zend_object_std_init(zend_object *object, zend_class_entry *ce TSRMLS_DC) /* {{{ */
 {
@@ -53,6 +54,22 @@ ZEND_API void zend_objects_destroy_object(zend_object *object, zend_object_handl
 {
        zend_function *destructor = object ? object->ce->destructor : NULL;
 
+#ifdef HAVE_DTRACE
+       if (DTRACE_OBJECT_DESTROY_ENABLED()) {
+               char *s_classname, *filename;
+               int s_classname_len, lineno;
+
+               filename = dtrace_get_executed_filename(TSRMLS_C);
+               lineno = zend_get_executed_lineno(TSRMLS_C);
+               if (u_strlen(object->ce->name.u) > 0) {
+                       zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, object->ce->name.u, u_strlen(object->ce->name.u) TSRMLS_CC);
+               }
+               DTRACE_OBJECT_DESTROY(s_classname, filename, lineno);
+               if (s_classname != NULL) {
+                       efree(s_classname);
+               }
+       }
+#endif /* HAVE_DTRACE */
        if (destructor) {
                zval *obj;
                zend_object_store_bucket *obj_bucket;
index 4e20143a0a37940e7e342d009e712b1097e88d56..7c15f25b3d2be8ea28bf71bb7e32a9190447bc94 100644 (file)
@@ -896,7 +896,7 @@ dnl ## this needs to be done before SAPI configureation
 if test "$PHP_DTRACE" = "yes"; then
   AC_CHECK_HEADERS([sys/sdt.h],
     [PHP_ADD_DTRACE([Zend/zend_dtrace.d], [main/main.c, Zend/zend_API.c \
-       Zend/zend_execute.c Zend/zend_exceptions.c \
+       Zend/zend_execute.c Zend/zend_exceptions.c Zend/zend_objects.c \
        Zend/zend_dtrace.c Zend/zend.c])
      PHP_INIT_DTRACE([Zend/zend_dtrace.d], [Zend/zend_dtrace_gen.h])
      AC_DEFINE(HAVE_DTRACE, 1, [Whether to enable DTrace support])],