dmitry                                   Fri, 27 Aug 2010 06:09:18 +0000

Revision: http://svn.php.net/viewvc?view=revision&revision=302841

Log:
Preallocate zend_hash instead of allocation/deallocation it on each request

Changed paths:
    U   php/php-src/trunk/Zend/zend_stack.c
    U   php/php-src/trunk/main/output.c
    U   php/php-src/trunk/main/php_output.h

Modified: php/php-src/trunk/Zend/zend_stack.c
===================================================================
--- php/php-src/trunk/Zend/zend_stack.c 2010-08-27 05:15:03 UTC (rev 302840)
+++ php/php-src/trunk/Zend/zend_stack.c 2010-08-27 06:09:18 UTC (rev 302841)
@@ -96,8 +96,8 @@
                for (i = 0; i < stack->top; i++) {
                        efree(stack->elements[i]);
                }
-
                efree(stack->elements);
+               stack->elements = NULL;
        }

        return SUCCESS;

Modified: php/php-src/trunk/main/output.c
===================================================================
--- php/php-src/trunk/main/output.c     2010-08-27 05:15:03 UTC (rev 302840)
+++ php/php-src/trunk/main/output.c     2010-08-27 06:09:18 UTC (rev 302841)
@@ -116,10 +116,7 @@
        memset(&output_globals, 0, sizeof(zend_output_globals));
 #endif

-       OG(handlers) = emalloc(sizeof(zend_stack));
-       if (SUCCESS != zend_stack_init(OG(handlers))) {
-               return FAILURE;
-       }
+       zend_stack_init(&OG(handlers));

        return SUCCESS;
 }
@@ -135,14 +132,12 @@
        OG(running) = NULL;

        /* release all output handlers */
-       if (OG(handlers)) {
-               while (SUCCESS == zend_stack_top(OG(handlers), (void *) 
&handler)) {
+       if (OG(handlers).elements) {
+               while (SUCCESS == zend_stack_top(&OG(handlers), (void *) 
&handler)) {
                        php_output_handler_free(handler TSRMLS_CC);
-                       zend_stack_del_top(OG(handlers));
+                       zend_stack_del_top(&OG(handlers));
                }
-               zend_stack_destroy(OG(handlers));
-               efree(OG(handlers));
-               OG(handlers) = NULL;
+               zend_stack_destroy(&OG(handlers));
        }
 }
 /* }}} */
@@ -218,9 +213,9 @@
                php_output_context_init(&context, PHP_OUTPUT_HANDLER_FLUSH 
TSRMLS_CC);
                php_output_handler_op(OG(active), &context);
                if (context.out.data && context.out.used) {
-                       zend_stack_del_top(OG(handlers));
+                       zend_stack_del_top(&OG(handlers));
                        php_output_write(context.out.data, context.out.used 
TSRMLS_CC);
-                       zend_stack_push(OG(handlers), &OG(active), 
sizeof(php_output_handler *));
+                       zend_stack_push(&OG(handlers), &OG(active), 
sizeof(php_output_handler *));
                }
                php_output_context_dtor(&context);
                return SUCCESS;
@@ -264,7 +259,7 @@

        if (OG(active)) {
                php_output_context_init(&context, PHP_OUTPUT_HANDLER_CLEAN 
TSRMLS_CC);
-               zend_stack_apply_with_argument(OG(handlers), 
ZEND_STACK_APPLY_TOPDOWN, php_output_stack_apply_clean, &context);
+               zend_stack_apply_with_argument(&OG(handlers), 
ZEND_STACK_APPLY_TOPDOWN, php_output_stack_apply_clean, &context);
        }
 }

@@ -312,7 +307,7 @@
        Get output buffering level, ie. how many output handlers the stack 
contains */
 PHPAPI int php_output_get_level(TSRMLS_D)
 {
-       return OG(active) ? zend_stack_count(OG(handlers)) : 0;
+       return OG(active) ? zend_stack_count(&OG(handlers)) : 0;
 }
 /* }}} */

@@ -500,7 +495,7 @@
                }
        }
        /* zend_stack_push never returns SUCCESS but FAILURE or stack level */
-       if (FAILURE == (handler->level = zend_stack_push(OG(handlers), 
&handler, sizeof(php_output_handler *)))) {
+       if (FAILURE == (handler->level = zend_stack_push(&OG(handlers), 
&handler, sizeof(php_output_handler *)))) {
                return FAILURE;
        }
        OG(active) = handler;
@@ -516,7 +511,7 @@
        int i, count = php_output_get_level(TSRMLS_C);

        if (count) {
-               handlers = *(php_output_handler ***) 
zend_stack_base(OG(handlers));
+               handlers = *(php_output_handler ***) 
zend_stack_base(&OG(handlers));

                for (i = 0; i < count; ++i) {
                        if (name_len == handlers[i]->name_len && 
!memcmp(handlers[i]->name, name, name_len)) {
@@ -977,13 +972,13 @@
         *  - apply op to the one active handler; note that OG(active) might be 
popped off the stack on a flush
         *  - or apply op to the handler stack
         */
-       if (OG(active) && (obh_cnt = zend_stack_count(OG(handlers)))) {
+       if (OG(active) && (obh_cnt = zend_stack_count(&OG(handlers)))) {
                context.in.data = (char *) str;
                context.in.used = len;

                if (obh_cnt > 1) {
-                       zend_stack_apply_with_argument(OG(handlers), 
ZEND_STACK_APPLY_TOPDOWN, php_output_stack_apply_op, &context);
-               } else if ((SUCCESS == zend_stack_top(OG(handlers), (void *) 
&active)) && (!((*active)->flags & PHP_OUTPUT_HANDLER_DISABLED))) {
+                       zend_stack_apply_with_argument(&OG(handlers), 
ZEND_STACK_APPLY_TOPDOWN, php_output_stack_apply_op, &context);
+               } else if ((SUCCESS == zend_stack_top(&OG(handlers), (void *) 
&active)) && (!((*active)->flags & PHP_OUTPUT_HANDLER_DISABLED))) {
                        php_output_handler_op(*active, &context);
                } else {
                        php_output_context_pass(&context);
@@ -1161,8 +1156,8 @@
                }

                /* pop it off the stack */
-               zend_stack_del_top(OG(handlers));
-               if (SUCCESS == zend_stack_top(OG(handlers), (void *) &current)) 
{
+               zend_stack_del_top(&OG(handlers));
+               if (SUCCESS == zend_stack_top(&OG(handlers), (void *) 
&current)) {
                        OG(active) = *current;
                } else {
                        OG(active) = NULL;
@@ -1411,7 +1406,7 @@
                return;
        }

-       zend_stack_apply_with_argument(OG(handlers), ZEND_STACK_APPLY_BOTTOMUP, 
php_output_stack_apply_list, return_value);
+       zend_stack_apply_with_argument(&OG(handlers), 
ZEND_STACK_APPLY_BOTTOMUP, php_output_stack_apply_list, return_value);
 }
 /* }}} */

@@ -1430,7 +1425,7 @@

        array_init(return_value);
        if (full_status) {
-               zend_stack_apply_with_argument(OG(handlers), 
ZEND_STACK_APPLY_BOTTOMUP, php_output_stack_apply_status, return_value);
+               zend_stack_apply_with_argument(&OG(handlers), 
ZEND_STACK_APPLY_BOTTOMUP, php_output_stack_apply_status, return_value);
        } else {
                php_output_handler_status(OG(active), return_value);
        }

Modified: php/php-src/trunk/main/php_output.h
===================================================================
--- php/php-src/trunk/main/php_output.h 2010-08-27 05:15:03 UTC (rev 302840)
+++ php/php-src/trunk/main/php_output.h 2010-08-27 06:09:18 UTC (rev 302841)
@@ -142,7 +142,7 @@

 ZEND_BEGIN_MODULE_GLOBALS(output)
        int flags;
-       zend_stack *handlers;
+       zend_stack handlers;
        php_output_handler *active;
        php_output_handler *running;
        char *output_start_filename;

-- 
PHP CVS Mailing List (http://www.php.net/)
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to