dmitry Mon Mar 13 11:13:55 2006 UTC
Modified files:
/ZendEngine2 zend_compile.h zend_constants.c zend_execute_API.c
zend_opcode.c
Log:
Optimized cleanup loops on request shutdown
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_compile.h?r1=1.337&r2=1.338&diff_format=u
Index: ZendEngine2/zend_compile.h
diff -u ZendEngine2/zend_compile.h:1.337 ZendEngine2/zend_compile.h:1.338
--- ZendEngine2/zend_compile.h:1.337 Fri Mar 10 08:29:22 2006
+++ ZendEngine2/zend_compile.h Mon Mar 13 11:13:55 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_compile.h,v 1.337 2006/03/10 08:29:22 dmitry Exp $ */
+/* $Id: zend_compile.h,v 1.338 2006/03/13 11:13:55 dmitry Exp $ */
#ifndef ZEND_COMPILE_H
#define ZEND_COMPILE_H
@@ -537,6 +537,7 @@
ZEND_API void zend_file_handle_dtor(zend_file_handle *fh);
ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC);
ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC);
+ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC);
ZEND_API void destroy_zend_function(zend_function *function TSRMLS_DC);
ZEND_API void zend_function_dtor(zend_function *function);
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_constants.c?r1=1.81&r2=1.82&diff_format=u
Index: ZendEngine2/zend_constants.c
diff -u ZendEngine2/zend_constants.c:1.81 ZendEngine2/zend_constants.c:1.82
--- ZendEngine2/zend_constants.c:1.81 Sun Feb 26 11:57:14 2006
+++ ZendEngine2/zend_constants.c Mon Mar 13 11:13:55 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_constants.c,v 1.81 2006/02/26 11:57:14 dmitry Exp $ */
+/* $Id: zend_constants.c,v 1.82 2006/03/13 11:13:55 dmitry Exp $ */
#include "zend.h"
#include "zend_constants.h"
@@ -60,11 +60,13 @@
static int clean_non_persistent_constant(zend_constant *c TSRMLS_DC)
{
- if (c->flags & CONST_PERSISTENT) {
- return EG(full_tables_cleanup) ? 0 : ZEND_HASH_APPLY_STOP;
- } else {
- return EG(full_tables_cleanup) ? 1 : ZEND_HASH_APPLY_REMOVE;
- }
+ return (c->flags & CONST_PERSISTENT) ? ZEND_HASH_APPLY_STOP : ZEND_HASH_APPLY_REMOVE;
+}
+
+
+static int clean_non_persistent_constant_full(zend_constant *c TSRMLS_DC)
+{
+ return (c->flags & CONST_PERSISTENT) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE;
}
@@ -164,7 +166,7 @@
void clean_non_persistent_constants(TSRMLS_D)
{
if (EG(full_tables_cleanup)) {
- zend_hash_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant TSRMLS_CC);
+ zend_hash_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant_full TSRMLS_CC);
} else {
zend_hash_reverse_apply(EG(zend_constants), (apply_func_t) clean_non_persistent_constant
TSRMLS_CC);
}
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_execute_API.c?r1=1.367&r2=1.368&diff_format=u
Index: ZendEngine2/zend_execute_API.c
diff -u ZendEngine2/zend_execute_API.c:1.367 ZendEngine2/zend_execute_API.c:1.368
--- ZendEngine2/zend_execute_API.c:1.367 Fri Mar 10 08:29:22 2006
+++ ZendEngine2/zend_execute_API.c Mon Mar 13 11:13:55 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_execute_API.c,v 1.367 2006/03/10 08:29:22 dmitry Exp $ */
+/* $Id: zend_execute_API.c,v 1.368 2006/03/13 11:13:55 dmitry Exp $ */
#include <stdio.h>
#include <signal.h>
@@ -107,23 +107,27 @@
}
-static int is_not_internal_function(zend_function *function TSRMLS_DC)
+static int clean_non_persistent_function(zend_function *function TSRMLS_DC)
{
- if (function->type == ZEND_INTERNAL_FUNCTION) {
- return EG(full_tables_cleanup) ? 0 : ZEND_HASH_APPLY_STOP;
- } else {
- return EG(full_tables_cleanup) ? 1 : ZEND_HASH_APPLY_REMOVE;
- }
+ return (function->type == ZEND_INTERNAL_FUNCTION) ? ZEND_HASH_APPLY_STOP :
ZEND_HASH_APPLY_REMOVE;
}
-static int is_not_internal_class(zend_class_entry **ce TSRMLS_DC)
+static int clean_non_persistent_function_full(zend_function *function TSRMLS_DC)
{
- if ((*ce)->type == ZEND_INTERNAL_CLASS) {
- return EG(full_tables_cleanup) ? 0 : ZEND_HASH_APPLY_STOP;
- } else {
- return EG(full_tables_cleanup) ? 1 : ZEND_HASH_APPLY_REMOVE;
- }
+ return (function->type == ZEND_INTERNAL_FUNCTION) ? ZEND_HASH_APPLY_KEEP :
ZEND_HASH_APPLY_REMOVE;
+}
+
+
+static int clean_non_persistent_class(zend_class_entry **ce TSRMLS_DC)
+{
+ return ((*ce)->type == ZEND_INTERNAL_CLASS) ? ZEND_HASH_APPLY_STOP : ZEND_HASH_APPLY_REMOVE;
+}
+
+
+static int clean_non_persistent_class_full(zend_class_entry **ce TSRMLS_DC)
+{
+ return ((*ce)->type == ZEND_INTERNAL_CLASS) ? ZEND_HASH_APPLY_KEEP : ZEND_HASH_APPLY_REMOVE;
}
@@ -263,18 +267,22 @@
So we want first of all to clean up all data and then move to tables destruction.
Note that only run-time accessed data need to be cleaned up, pre-defined data can
not contain objects and thus are not probelmatic */
- zend_hash_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data TSRMLS_CC);
+ if (EG(full_tables_cleanup)) {
+ zend_hash_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data_full TSRMLS_CC);
+ } else {
+ zend_hash_reverse_apply(EG(function_table), (apply_func_t) zend_cleanup_function_data
TSRMLS_CC);
+ }
zend_hash_apply(EG(class_table), (apply_func_t) zend_cleanup_class_data TSRMLS_CC);
zend_ptr_stack_destroy(&EG(argument_stack));
/* Destroy all op arrays */
if (EG(full_tables_cleanup)) {
- zend_hash_apply(EG(function_table), (apply_func_t) is_not_internal_function TSRMLS_CC);
- zend_hash_apply(EG(class_table), (apply_func_t) is_not_internal_class TSRMLS_CC);
+ zend_hash_apply(EG(function_table), (apply_func_t) clean_non_persistent_function_full
TSRMLS_CC);
+ zend_hash_apply(EG(class_table), (apply_func_t) clean_non_persistent_class_full TSRMLS_CC);
} else {
- zend_hash_reverse_apply(EG(function_table), (apply_func_t) is_not_internal_function TSRMLS_CC);
- zend_hash_reverse_apply(EG(class_table), (apply_func_t) is_not_internal_class TSRMLS_CC);
+ zend_hash_reverse_apply(EG(function_table), (apply_func_t) clean_non_persistent_function
TSRMLS_CC);
+ zend_hash_reverse_apply(EG(class_table), (apply_func_t) clean_non_persistent_class TSRMLS_CC);
}
while (EG(symtable_cache_ptr)>=EG(symtable_cache)) {
http://cvs.php.net/viewcvs.cgi/ZendEngine2/zend_opcode.c?r1=1.119&r2=1.120&diff_format=u
Index: ZendEngine2/zend_opcode.c
diff -u ZendEngine2/zend_opcode.c:1.119 ZendEngine2/zend_opcode.c:1.120
--- ZendEngine2/zend_opcode.c:1.119 Fri Mar 10 08:29:22 2006
+++ ZendEngine2/zend_opcode.c Mon Mar 13 11:13:55 2006
@@ -17,7 +17,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: zend_opcode.c,v 1.119 2006/03/10 08:29:22 dmitry Exp $ */
+/* $Id: zend_opcode.c,v 1.120 2006/03/13 11:13:55 dmitry Exp $ */
#include <stdio.h>
@@ -135,8 +135,18 @@
{
if (function->type == ZEND_USER_FUNCTION) {
zend_cleanup_op_array_data((zend_op_array *) function);
+ return ZEND_HASH_APPLY_KEEP;
+ } else {
+ return ZEND_HASH_APPLY_STOP;
}
- return 0;
+}
+
+ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC)
+{
+ if (function->type == ZEND_USER_FUNCTION) {
+ zend_cleanup_op_array_data((zend_op_array *) function);
+ }
+ return ZEND_HASH_APPLY_KEEP;
}
ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC)
@@ -145,7 +155,7 @@
/* Clean all parts that can contain run-time data */
/* Note that only run-time accessed data need to be cleaned up, pre-defined data can
not contain objects and thus are not probelmatic */
- zend_hash_apply(&(*pce)->function_table, (apply_func_t) zend_cleanup_function_data
TSRMLS_CC);
+ zend_hash_apply(&(*pce)->function_table, (apply_func_t) zend_cleanup_function_data_full
TSRMLS_CC);
(*pce)->static_members = NULL;
} else if (CE_STATIC_MEMBERS(*pce)) {
zend_hash_destroy(CE_STATIC_MEMBERS(*pce));