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

Reply via email to