Currently object's destructors are called in the zend_deactivate function in
main.c after the modules
request_shutdown_func has been called (main.c -
php_call_shutdown_functions(void); ) .

Since no code should be executed after module request shutdown unexpected
behaviour might
occur like the one descibed in bug#27555 affecting the session extension.

Maybe somebody can take a look.

./regards

Florian

<?php
// Short test which saves a session in the destructor
class TestSession {
 public static $oSessionMap;

 public function __construct() {
  session_start();
  if( empty($_SESSION['sessionObject']) ) {
   TestSession::$oSessionMap = array();
  } else if ( ! is_array(TestSession::$oSessionMap) ) {
   TestSession::$oSessionMap = unserialize( $_SESSION['sessionObject'] );
  } // if / else
 } // public function __construct

 public function add( $sKey, $sValue ) {
  TestSession::$oSessionMap[ $sKey ]  = $sValue;
 } // public function add

 public function get( $sKey ) {
  return TestSession::$oSessionMap[ $sKey ];
 } // public function get

 public function __destruct() {
  $_SESSION['sessionObject'] = serialize(TestSession::$oSessionMap);
 } // public function __destruct
} // class Session

$oSes = new TestSession();
echo $oSes->get("test1","testval");
$oSes->add("test1","testval");

?>
Index: ZendEngine2/zend.c
===================================================================
RCS file: /repository/ZendEngine2/zend.c,v
retrieving revision 1.285
diff -u -r1.285 zend.c
--- ZendEngine2/zend.c  1 Jun 2004 11:45:46 -0000       1.285
+++ ZendEngine2/zend.c  2 Jul 2004 18:32:10 -0000
@@ -805,6 +805,13 @@
        } zend_end_try();
 }
 
+void zend_call_destructors(TSRMLS_D) 
+{
+       zend_try {
+               shutdown_destructors(TSRMLS_C);
+       } zend_end_try();
+}
+
 void zend_deactivate(TSRMLS_D)
 {
        /* we're no longer executing anything */
Index: ZendEngine2/zend.h
===================================================================
RCS file: /repository/ZendEngine2/zend.h,v
retrieving revision 1.255
diff -u -r1.255 zend.h
--- ZendEngine2/zend.h  7 Jun 2004 18:57:34 -0000       1.255
+++ ZendEngine2/zend.h  2 Jul 2004 18:32:11 -0000
@@ -450,6 +450,7 @@
 
 void zend_activate(TSRMLS_D);
 void zend_deactivate(TSRMLS_D);
+void zend_call_destructors(TSRMLS_D);
 void zend_activate_modules(TSRMLS_D);
 void zend_deactivate_modules(TSRMLS_D);
 void zend_post_deactivate_modules(TSRMLS_D);
Index: ZendEngine2/zend_execute.h
===================================================================
RCS file: /repository/ZendEngine2/zend_execute.h,v
retrieving revision 1.72
diff -u -r1.72 zend_execute.h
--- ZendEngine2/zend_execute.h  16 Mar 2004 10:14:52 -0000      1.72
+++ ZendEngine2/zend_execute.h  2 Jul 2004 18:32:11 -0000
@@ -49,6 +49,7 @@
 
 void init_executor(TSRMLS_D);
 void shutdown_executor(TSRMLS_D);
+void shutdown_destructors(TSRMLS_D);
 ZEND_API void execute(zend_op_array *op_array TSRMLS_DC);
 ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, int 
return_value_used TSRMLS_DC);
 ZEND_API int zend_is_true(zval *op);
Index: ZendEngine2/zend_execute_API.c
===================================================================
RCS file: /repository/ZendEngine2/zend_execute_API.c,v
retrieving revision 1.287
diff -u -r1.287 zend_execute_API.c
--- ZendEngine2/zend_execute_API.c      18 May 2004 20:14:54 -0000      1.287
+++ ZendEngine2/zend_execute_API.c      2 Jul 2004 18:32:11 -0000
@@ -187,6 +187,12 @@
        EG(float_separator)[0] = '.';
 }
 
+void shutdown_destructors(TSRMLS_D) {
+       zend_try {
+               zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC);
+       } zend_end_try();
+}
+
 void shutdown_executor(TSRMLS_D)
 {
        zend_try {
@@ -206,7 +212,6 @@
                }
 */
                zend_llist_apply(&zend_extensions, (llist_apply_func_t) 
zend_extension_deactivator TSRMLS_CC);
-               zend_objects_store_call_destructors(&EG(objects_store) TSRMLS_CC);
                zend_hash_graceful_reverse_destroy(&EG(symbol_table));
        } zend_end_try();
 
Index: main/main.c
===================================================================
RCS file: /repository/php-src/main/main.c,v
retrieving revision 1.604
diff -u -r1.604 main.c
--- main/main.c 28 May 2004 14:14:26 -0000      1.604
+++ main/main.c 2 Jul 2004 18:32:16 -0000
@@ -1190,6 +1190,10 @@
                sapi_send_headers(TSRMLS_C);
        } zend_end_try();
 
+       zend_try {
+               zend_call_destructors(TSRMLS_C);
+       } zend_end_try();
+
        if (PG(modules_activated)) zend_try {
                php_call_shutdown_functions();
        } zend_end_try();

-- 
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to