dsp Sun, 19 Jul 2009 14:00:25 +0000 URL: http://svn.php.net/viewvc?view=revision&revision=284350
Changed paths: U php/php-src/trunk/NEWS U php/php-src/trunk/Zend/zend.c A php/php-src/trunk/Zend/zend_dtrace.c A php/php-src/trunk/Zend/zend_dtrace.d A php/php-src/trunk/Zend/zend_dtrace.h U php/php-src/trunk/Zend/zend_exceptions.c U php/php-src/trunk/Zend/zend_execute.c U php/php-src/trunk/Zend/zend_vm_def.h U php/php-src/trunk/Zend/zend_vm_execute.h U php/php-src/trunk/acinclude.m4 U php/php-src/trunk/configure.in U php/php-src/trunk/main/main.c Log: - Add DTrace support.
Modified: php/php-src/trunk/NEWS =================================================================== --- php/php-src/trunk/NEWS 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/NEWS 2009-07-19 14:00:25 UTC (rev 284350) @@ -38,6 +38,7 @@ - Improved ext/dba: . Added support for Tokyo Cabinet. (Michael) +- Added DTrace support. (David Soria Parra) - Added runtime JIT auto-globals fetching and caching. (Dmitry, Sara) - Added E_STRICT to E_ALL. (Dmitry) - Added "context" and "binary_pipes" params in "other_options" for proc_open(). Modified: php/php-src/trunk/Zend/zend.c =================================================================== --- php/php-src/trunk/Zend/zend.c 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/Zend/zend.c 2009-07-19 14:00:25 UTC (rev 284350) @@ -30,6 +30,7 @@ #include "zend_ini.h" #include "zend_vm.h" #include "zend_unicode.h" +#include "zend_dtrace.h" #ifdef ZTS # define GLOBAL_FUNCTION_TABLE global_function_table @@ -1133,10 +1134,18 @@ zend_getenv = utility_functions->getenv_function; zend_resolve_path = utility_functions->resolve_path_function; +#if HAVE_SYS_SDT_H +/* build with dtrace support */ + zend_compile_file = dtrace_compile_file; + zend_execute = dtrace_execute; + zend_execute_internal = dtrace_execute_internal; +#else zend_compile_file = compile_file; - zend_compile_string = compile_string; zend_execute = execute; zend_execute_internal = NULL; +#endif /* HAVE_SYS_SDT_H */ + + zend_compile_string = compile_string; zend_throw_exception_hook = NULL; zend_init_opcodes_handlers(); @@ -1537,6 +1546,7 @@ zval *orig_user_error_handler; zend_bool in_compilation; zend_class_entry *saved_class_entry; + char dtrace_error_buffer[1024]; TSRMLS_FETCH(); /* Obtain relevant filename and lineno */ @@ -1581,6 +1591,12 @@ va_start(args, format); + if(DTRACE_ERROR_ENABLED()) { + vsprintf(dtrace_error_buffer, format, args); + } + DTRACE_ERROR(dtrace_error_buffer, error_filename, error_lineno); + + /* if we don't have a user defined error handler */ if (!EG(user_error_handler) || !(EG(user_error_handler_error_reporting) & type) Added: php/php-src/trunk/Zend/zend_dtrace.c =================================================================== --- php/php-src/trunk/Zend/zend_dtrace.c (rev 0) +++ php/php-src/trunk/Zend/zend_dtrace.c 2009-07-19 14:00:25 UTC (rev 284350) @@ -0,0 +1,122 @@ +/* + +----------------------------------------------------------------------+ + | Zend Engine | + +----------------------------------------------------------------------+ + | Copyright (c) 1998-2009 Zend Technologies Ltd. (http://www.zend.com) | + +----------------------------------------------------------------------+ + | This source file is subject to version 2.00 of the Zend license, | + | that is bundled with this package in the file LICENSE, and is | + | available through the world-wide-web at the following url: | + | http://www.zend.com/license/2_00.txt. | + | If you did not receive a copy of the Zend license and are unable to | + | obtain it through the world-wide-web, please send a note to | + | lice...@zend.com so we can mail you a copy immediately. | + +----------------------------------------------------------------------+ + | Authors: David Soria Parra <david.soriapa...@sun.com> | + +----------------------------------------------------------------------+ +*/ + +/* $Id$ */ + +#include "zend.h" +#include "zend_API.h" +#include "zend_dtrace.h" + +#ifdef HAVE_SYS_SDT_H +/* PHP DTrace probes {{{ */ +static inline 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; + } else { + return zend_get_executed_filename(TSRMLS_C); + } +} + +ZEND_API zend_op_array *dtrace_compile_file(zend_file_handle *file_handle, int type TSRMLS_DC) +{ + zend_op_array *res; + DTRACE_COMPILE_FILE_ENTRY(file_handle->opened_path, file_handle->filename); + res = compile_file(file_handle, type TSRMLS_CC); + DTRACE_COMPILE_FILE_RETURN(file_handle->opened_path, file_handle->filename); + + return res; +} + +/* We wrap the execute function to have fire the execute-entry/return and function-entry/return probes */ +ZEND_API void dtrace_execute(zend_op_array *op_array TSRMLS_DC) +{ + int lineno, s_funcname_len, s_classname_len; + char *scope, *filename, *s_funcname, *s_classname; + zstr classname, funcname; + + scope = filename = s_funcname = s_classname = NULL; + classname = funcname = EMPTY_ZSTR; + + /* we need filename and lineno for both execute and function probes */ + if (DTRACE_EXECUTE_ENTRY_ENABLED() || DTRACE_EXECUTE_RETURN_ENABLED() + || DTRACE_FUNCTION_ENTRY_ENABLED() || DTRACE_FUNCTION_RETURN_ENABLED()) { + filename = dtrace_get_executed_filename(TSRMLS_C); + lineno = zend_get_executed_lineno(TSRMLS_C); + } + + if (DTRACE_FUNCTION_ENTRY_ENABLED() || DTRACE_FUNCTION_RETURN_ENABLED()) { + funcname = get_active_function_name(TSRMLS_C); + classname = get_active_class_name(&scope TSRMLS_CC); + + /* We encode everything to utf8 so that we have a predictable output */ + if (funcname.u != NULL) + zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_funcname, &s_funcname_len, funcname.u, u_strlen(funcname.u) TSRMLS_CC); + + /* classname might be EMPTY_STR, in that case we have pass NULL to the probe, so that + we use appropriate predicates in our dtrace scripts to detect if we are in class context */ + if (u_strlen(classname.u) > 0) + zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, classname.u, u_strlen(classname.u) TSRMLS_CC); + } + + if (DTRACE_EXECUTE_ENTRY_ENABLED()) { + DTRACE_EXECUTE_ENTRY(filename, lineno); + } + + if (DTRACE_FUNCTION_ENTRY_ENABLED() && funcname.u != NULL) { + DTRACE_FUNCTION_ENTRY(s_funcname, filename, lineno, s_classname, scope); + } + + execute(op_array TSRMLS_CC); + + if (DTRACE_FUNCTION_RETURN_ENABLED() && funcname.u != NULL) { + DTRACE_FUNCTION_RETURN(s_funcname, filename, lineno, s_classname, scope); + } + + if (DTRACE_EXECUTE_RETURN_ENABLED()) { + DTRACE_EXECUTE_RETURN(filename, lineno); + } + + if (DTRACE_FUNCTION_ENTRY_ENABLED() || DTRACE_FUNCTION_RETURN_ENABLED()) { + /* s_funcname and s_classname were allocated by zend_unicode_to_string */ + if (s_funcname != NULL) + efree(s_funcname); + if (s_classname != NULL) + efree(s_classname); + } +} + +ZEND_API void dtrace_execute_internal(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC) +{ + int lineno; + char *filename; + if (DTRACE_EXECUTE_ENTRY_ENABLED() || DTRACE_EXECUTE_RETURN_ENABLED()) { + filename = dtrace_get_executed_filename(TSRMLS_C); + lineno = zend_get_executed_lineno(TSRMLS_C); + } + + DTRACE_EXECUTE_ENTRY(filename, lineno); + + execute_internal(execute_data_ptr, return_value_used TSRMLS_CC); + + DTRACE_EXECUTE_RETURN(filename, lineno); +} + +/* }}} */ +#endif + Added: php/php-src/trunk/Zend/zend_dtrace.d =================================================================== --- php/php-src/trunk/Zend/zend_dtrace.d (rev 0) +++ php/php-src/trunk/Zend/zend_dtrace.d 2009-07-19 14:00:25 UTC (rev 284350) @@ -0,0 +1,17 @@ +provider php { + probe exception__caught(char *classname); + probe exception__thrown(char* classname); + probe request__startup(char* request_file, char* request_uri, char* request_method); + probe request__shutdown(char* request_file, char* request_uri, char* request_method); + probe compile__file__entry(char * compile_file, char *compile_file_translated); + probe compile__file__return(char *compile_file, char *compile_file_translated); + probe error(char *errormsg, char *request_file, int lineno); + probe execute__entry(char* request_file, int lineno); + 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); +}; + +#pragma D attributes Evolving/Evolving/Common provider php provider +#pragma D attributes Private/Private/Unknown provider php module +#pragma D attributes Private/Private/Unknown provider php function Added: php/php-src/trunk/Zend/zend_dtrace.h =================================================================== --- php/php-src/trunk/Zend/zend_dtrace.h (rev 0) +++ php/php-src/trunk/Zend/zend_dtrace.h 2009-07-19 14:00:25 UTC (rev 284350) @@ -0,0 +1,55 @@ +/* + * Generated by dtrace(1M). + */ + +#ifndef _ZEND_DTRACE_H +#define _ZEND_DTRACE_H + +#include <unistd.h> + +#ifdef __cplusplus +extern "C" { +#endif + +#ifdef HAVE_SYS_SDT_H +ZEND_API zend_op_array *(*zend_dtrace_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); +ZEND_API void (*zend_dtrace_execute)(zend_op_array *op_array TSRMLS_DC); +ZEND_API void (*zend_dtrace_execute_internal)(zend_execute_data *execute_data_ptr, int return_value_used TSRMLS_DC); + +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); +#include <zend_dtrace_gen.h> + +#else + +#define DTRACE_COMPILE_FILE_ENTRY(arg0, arg1) +#define DTRACE_COMPILE_FILE_ENTRY_ENABLED() (0) +#define DTRACE_COMPILE_FILE_RETURN(arg0, arg1) +#define DTRACE_COMPILE_FILE_RETURN_ENABLED() (0) +#define DTRACE_ERROR(arg0, arg1, arg2) +#define DTRACE_ERROR_ENABLED() (0) +#define DTRACE_EXCEPTION_CAUGHT(arg0) +#define DTRACE_EXCEPTION_CAUGHT_ENABLED() (0) +#define DTRACE_EXCEPTION_THROWN(arg0) +#define DTRACE_EXCEPTION_THROWN_ENABLED() (0) +#define DTRACE_EXECUTE_ENTRY(arg0, arg1) +#define DTRACE_EXECUTE_ENTRY_ENABLED() (0) +#define DTRACE_EXECUTE_RETURN(arg0, arg1) +#define DTRACE_EXECUTE_RETURN_ENABLED() (0) +#define DTRACE_FUNCTION_ENTRY(arg0, arg1, arg2, arg3, arg4) +#define DTRACE_FUNCTION_ENTRY_ENABLED() (0) +#define DTRACE_FUNCTION_RETURN(arg0, arg1, arg2, arg3, arg4) +#define DTRACE_FUNCTION_RETURN_ENABLED() (0) +#define DTRACE_REQUEST_SHUTDOWN(arg0, arg1, arg2) +#define DTRACE_REQUEST_SHUTDOWN_ENABLED() (0) +#define DTRACE_REQUEST_STARTUP(arg0, arg1, arg2) +#define DTRACE_REQUEST_STARTUP_ENABLED() (0) + +#endif /* HAVE_SYS_SDT */ + +#ifdef __cplusplus +} +#endif + +#endif /* _ZEND_DTRACE_H */ Modified: php/php-src/trunk/Zend/zend_exceptions.c =================================================================== --- php/php-src/trunk/Zend/zend_exceptions.c 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/Zend/zend_exceptions.c 2009-07-19 14:00:25 UTC (rev 284350) @@ -27,6 +27,7 @@ #include "zend_interfaces.h" #include "zend_exceptions.h" #include "zend_vm.h" +#include "zend_dtrace.h" zend_class_entry *default_exception_ce; zend_class_entry *error_exception_ce; @@ -82,6 +83,21 @@ void zend_throw_exception_internal(zval *exception TSRMLS_DC) /* {{{ */ { + if (DTRACE_EXCEPTION_THROWN_ENABLED()) { + zstr classname; + char *s_classname; + int name_len, s_classname_len; + + classname = NULL_ZSTR; + zend_get_object_classname(exception, &classname, &name_len); + zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, classname.u, u_strlen(classname.u) TSRMLS_CC); + + DTRACE_EXCEPTION_THROWN(s_classname); + + efree(classname.v); + efree(s_classname); + } + if (exception != NULL) { zval *previous = EG(exception); zend_exception_set_previous(exception, EG(exception) TSRMLS_CC); Modified: php/php-src/trunk/Zend/zend_execute.c =================================================================== --- php/php-src/trunk/Zend/zend_execute.c 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/Zend/zend_execute.c 2009-07-19 14:00:25 UTC (rev 284350) @@ -37,6 +37,7 @@ #include "zend_closures.h" #include "zend_vm.h" #include "zend_unicode.h" +#include "zend_dtrace.h" /* Virtual current working directory support */ #include "tsrm_virtual_cwd.h" Modified: php/php-src/trunk/Zend/zend_vm_def.h =================================================================== --- php/php-src/trunk/Zend/zend_vm_def.h 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/Zend/zend_vm_def.h 2009-07-19 14:00:25 UTC (rev 284350) @@ -2626,6 +2626,15 @@ ZEND_VM_CONTINUE(); /* CHECK_ME */ } ce = Z_OBJCE_P(EG(exception)); + + if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) { + char *s_classname; + int s_classname_len; + zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, ce->name.u, u_strlen(ce->name.u) TSRMLS_CC); + DTRACE_EXCEPTION_CAUGHT(s_classname); + efree(s_classname); + } + if (ce != EX_T(opline->op1.u.var).class_entry) { if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) { if (opline->op1.u.EA.type) { Modified: php/php-src/trunk/Zend/zend_vm_execute.h =================================================================== --- php/php-src/trunk/Zend/zend_vm_execute.h 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/Zend/zend_vm_execute.h 2009-07-19 14:00:25 UTC (rev 284350) @@ -1190,6 +1190,15 @@ ZEND_VM_CONTINUE(); /* CHECK_ME */ } ce = Z_OBJCE_P(EG(exception)); + + if (DTRACE_EXCEPTION_CAUGHT_ENABLED()) { + char *s_classname; + int s_classname_len; + zend_unicode_to_string(ZEND_U_CONVERTER(UG(utf8_conv)), &s_classname, &s_classname_len, ce->name.u, u_strlen(ce->name.u) TSRMLS_CC); + DTRACE_EXCEPTION_CAUGHT(s_classname); + efree(s_classname); + } + if (ce != EX_T(opline->op1.u.var).class_entry) { if (!instanceof_function(ce, EX_T(opline->op1.u.var).class_entry TSRMLS_CC)) { if (opline->op1.u.EA.type) { Modified: php/php-src/trunk/acinclude.m4 =================================================================== --- php/php-src/trunk/acinclude.m4 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/acinclude.m4 2009-07-19 14:00:25 UTC (rev 284350) @@ -2874,3 +2874,58 @@ fi ]) +dnl +dnl Generate dtrace targets +dnl +AC_DEFUN([PHP_GENERATE_DTRACE],[ + old_IFS=[$]IFS + IFS=. + set $ac_src + IFS=$old_IFS + build_target=$2 + PHP_GLOBAL_OBJS="[$]PHP_GLOBAL_OBJS $1.o" + for src in $PHP_DTRACE_OBJS; do + case [$]build_target in + program|static) + obj="$obj `dirname $src`/`basename $src | sed 's,\.lo$,.o,'` " ;; + *) + obj="$obj `dirname $src`/.libs/`basename $src | sed 's,\.lo$,.o,'` " ;; + esac + done + + cat >>Makefile.objects<<EOF +$1.o: \$(PHP_DTRACE_OBJS) + dtrace -G -o $1.o -s $1 $obj +EOF + +]) + +dnl +dnl Link given source files with dtrace +dnl PHP_ADD_DTRACE(providerdesc, sources, module) +dnl +AC_DEFUN([PHP_ADD_DTRACE],[ + case "$3" in + ""[)] unset ac_bdir;; + /*[)] ac_bdir=$ac_srcdir;; + *[)] extdir=PHP_EXT_DIR($3); ac_bdir="$extdir/";; + esac + old_IFS=[$]IFS + for ac_src in $2; do + IFS=. + set $ac_src + ac_obj=[$]1 + IFS=$old_IFS + + PHP_DTRACE_OBJS="[$]PHP_DTRACE_OBJS [$]ac_bdir[$]ac_obj.lo" + done; +]) + +dnl +dnl Generate platform specific dtrace header +dnl +AC_DEFUN([PHP_INIT_DTRACE], [ + dtrace -h -C -s $1 -o $2 + $SED -ibak 's,PHP_,DTRACE_,g' $2 +]) + Modified: php/php-src/trunk/configure.in =================================================================== --- php/php-src/trunk/configure.in 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/configure.in 2009-07-19 14:00:25 UTC (rev 284350) @@ -895,6 +895,22 @@ AC_DEFINE(HAVE_IPV6, 1, [Whether to enable IPv6 support]) fi +dnl ## DTRACE CHECHKS +dnl ## this needs to be done before SAPI configureation +PHP_ARG_ENABLE(dtrace, whether to enable DTrace support, +[ --enable-dtrace Enable DTrace support], no, no) + +dnl ## DTRACE CHECHKS +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_dtrace.c Zend/zend.c]) + PHP_INIT_DTRACE([Zend/zend_dtrace.d], [Zend/zend_dtrace_gen.h])], + []) +fi + AC_MSG_CHECKING([how big to make fd sets]) PHP_ARG_ENABLE(fd-setsize,, [ --enable-fd-setsize Set size of descriptor sets], no, no) @@ -1163,6 +1179,7 @@ PHP_SUBST(PHP_CLI_TARGET) PHP_SUBST(PHP_SAPI_OBJS) PHP_SUBST(PHP_CLI_OBJS) +PHP_SUBST(PHP_DTRACE_OBJS) PHP_SUBST(PHP_GLOBAL_OBJS) PHP_SUBST(PHP_MODULES) @@ -1352,7 +1369,7 @@ PHP_ADD_SOURCES(Zend, \ zend_language_parser.c zend_language_scanner.c \ zend_ini_parser.c zend_ini_scanner.c \ - zend_alloc.c zend_compile.c zend_constants.c \ + zend_alloc.c zend_compile.c zend_constants.c zend_dtrace.c \ zend_execute_API.c zend_unicode.c zend_highlight.c zend_llist.c \ zend_opcode.c zend_operators.c zend_ptr_stack.c zend_stack.c \ zend_variables.c zend.c zend_API.c zend_extensions.c zend_hash.c \ @@ -1384,6 +1401,13 @@ PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Makefile.frag,$abs_srcdir/Zend,Zend) PHP_ADD_MAKEFILE_FRAGMENT($abs_srcdir/Zend/Makefile.frag,$abs_srcdir/Zend,Zend) +if test "$PHP_DTRACE" = "yes"; then + case $host_alias in + *solaris*) + PHP_GENERATE_DTRACE([Zend/zend_dtrace.d],$php_build_target);; + esac +fi + PHP_GEN_BUILD_DIRS PHP_GEN_GLOBAL_MAKEFILE Modified: php/php-src/trunk/main/main.c =================================================================== --- php/php-src/trunk/main/main.c 2009-07-19 11:15:56 UTC (rev 284349) +++ php/php-src/trunk/main/main.c 2009-07-19 14:00:25 UTC (rev 284350) @@ -81,6 +81,7 @@ #include "zend_indent.h" #include "zend_extensions.h" #include "zend_ini.h" +#include "zend_dtrace.h" #include "php_content_types.h" #include "php_ticks.h" @@ -1440,6 +1441,8 @@ { int retval = SUCCESS; + DTRACE_REQUEST_STARTUP(SAFE_FILENAME(SG(request_info).path_translated), SAFE_FILENAME(SG(request_info).request_uri), SAFE_FILENAME(SG(request_info).request_method)); + #ifdef PHP_WIN32 PG(com_initialized) = 0; #endif @@ -1720,6 +1723,8 @@ PG(com_initialized) = 0; } #endif + + DTRACE_REQUEST_SHUTDOWN(SAFE_FILENAME(SG(request_info).path_translated), SAFE_FILENAME(SG(request_info).request_uri), SAFE_FILENAME(SG(request_info).request_method)); } /* }}} */
-- PHP CVS Mailing List (http://www.php.net/) To unsubscribe, visit: http://www.php.net/unsub.php