sixd            Mon Mar  9 20:09:07 2009 UTC

  Added files:                 (Branch: PHP_5_3)
    /php-src/ext/oci8/tests     b47243_1.phpt b47243_2.phpt b47243_3.phpt 

  Modified files:              
    /php-src/ext/oci8   oci8.c php_oci8_int.h 
    /php-src/ext/oci8/tests     debug.phpt 
  Log:
  MFH: Bug #47243 (Crash at shutdown on Windows)
  
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8.c?r1=1.269.2.16.2.38.2.30&r2=1.269.2.16.2.38.2.31&diff_format=u
Index: php-src/ext/oci8/oci8.c
diff -u php-src/ext/oci8/oci8.c:1.269.2.16.2.38.2.30 
php-src/ext/oci8/oci8.c:1.269.2.16.2.38.2.31
--- php-src/ext/oci8/oci8.c:1.269.2.16.2.38.2.30        Mon Mar  9 19:01:16 2009
+++ php-src/ext/oci8/oci8.c     Mon Mar  9 20:09:07 2009
@@ -26,7 +26,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: oci8.c,v 1.269.2.16.2.38.2.30 2009/03/09 19:01:16 sixd Exp $ */
+/* $Id: oci8.c,v 1.269.2.16.2.38.2.31 2009/03/09 20:09:07 sixd Exp $ */
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
@@ -39,6 +39,14 @@
 
 #if HAVE_OCI8
 
+#if PHP_MAJOR_VERSION > 5
+#error This version of the PHP OCI8 extension is not compatible with PHP 6 or 
later
+#elif PHP_MAJOR_VERSION < 5
+#ifdef ZTS
+#error The PHP OCI8 extension does not support ZTS mode in PHP 4
+#endif
+#endif
+
 #include "php_oci8.h"
 #include "php_oci8_int.h"
 #include "zend_hash.h"
@@ -47,6 +55,7 @@
 #if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 
5)
 /* This "if" allows PECL builds from this file to be portable to older PHP 
releases */
 static PHP_GINIT_FUNCTION(oci);
+static PHP_GSHUTDOWN_FUNCTION(oci);
 #endif
 
 /* Allow PHP 5.3 branch to be used in PECL for 5.x compatible builds */
@@ -96,9 +105,6 @@
 static void php_oci_collection_list_dtor (zend_rsrc_list_entry * TSRMLS_DC);
 
 static int php_oci_persistent_helper(zend_rsrc_list_entry *le TSRMLS_DC);
-#ifdef ZTS
-static int php_oci_list_helper(zend_rsrc_list_entry *le, void *le_type 
TSRMLS_DC);
-#endif
 static int php_oci_connection_ping(php_oci_connection * TSRMLS_DC);
 static int php_oci_connection_status(php_oci_connection * TSRMLS_DC);
 static int php_oci_connection_close(php_oci_connection * TSRMLS_DC);
@@ -941,7 +947,7 @@
        /* This check allows PECL builds from this file to be portable to older 
PHP releases */
        PHP_MODULE_GLOBALS(oci),  /* globals descriptor */
        PHP_GINIT(oci),                   /* globals ctor */
-       NULL,                                     /* globals dtor */
+       PHP_GSHUTDOWN(oci),               /* globals dtor */
        NULL,                                     /* post deactivate */
        STANDARD_MODULE_PROPERTIES_EX
 #else
@@ -1068,6 +1074,21 @@
 }
 /* }}} */
 
+/* {{{ PHP_GSHUTDOWN_FUNCTION
+ *
+ * Called for thread shutdown in ZTS, after module shutdown for non-ZTS
+ */
+/* This check allows PECL builds from this file to be portable to older PHP 
releases */
+#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION > 1) || (PHP_MAJOR_VERSION > 
5)
+static PHP_GSHUTDOWN_FUNCTION(oci)
+#else
+static void php_oci_shutdown_globals(zend_oci_globals *oci_globals TSRMLS_DC)
+#endif
+{
+       php_oci_cleanup_global_handles(TSRMLS_C);
+}
+/* }}} */
+
 PHP_MINIT_FUNCTION(oci)
 {
        zend_class_entry oci_lob_class_entry;
@@ -1077,7 +1098,7 @@
        /* This check allows PECL builds from this file to be portable to older 
PHP releases */
        /* this is handled by new globals management code */
 #else
-       ZEND_INIT_MODULE_GLOBALS(oci, php_oci_init_globals, NULL);
+       ZEND_INIT_MODULE_GLOBALS(oci, php_oci_init_globals, 
php_oci_shutdown_globals);
 #endif
        REGISTER_INI_ENTRIES();
 
@@ -1189,40 +1210,28 @@
 
 PHP_MSHUTDOWN_FUNCTION(oci)
 {
-       OCI_G(shutdown) = 1;
-
-       UNREGISTER_INI_ENTRIES();
-
+/* Work around PHP_GSHUTDOWN_FUNCTION not being called in older versions of 
PHP */
+#if (PHP_MAJOR_VERSION == 5 && PHP_MINOR_VERSION < 2) || (PHP_MAJOR_VERSION < 
5)
 #ifndef ZTS
        php_oci_cleanup_global_handles(TSRMLS_C);
 #endif
+#endif
+
+       OCI_G(shutdown) = 1;
+
+       UNREGISTER_INI_ENTRIES();
 
        return SUCCESS;
 }
 
 PHP_RSHUTDOWN_FUNCTION(oci)
 {
-#ifdef ZTS
-       zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) 
php_oci_list_helper, (void *)le_descriptor TSRMLS_CC);
-       zend_hash_apply_with_argument(&EG(regular_list), (apply_func_arg_t) 
php_oci_list_helper, (void *)le_collection TSRMLS_CC);
-       while (OCI_G(num_statements) > 0) {
-               zend_hash_apply_with_argument(&EG(regular_list), 
(apply_func_arg_t) php_oci_list_helper, (void *)le_statement TSRMLS_CC);
-       }
-#endif
-
        /* Check persistent connections and do the necessary actions if needed. 
If persistent_helper is
         * unable to process a pconnection because of a refcount, the 
processing would happen from
         * np-destructor which is called when refcount goes to zero - 
php_oci_pconnection_list_np_dtor
         */
        zend_hash_apply(&EG(persistent_list), (apply_func_t) 
php_oci_persistent_helper TSRMLS_CC);
 
-#ifdef ZTS
-       while (OCI_G(num_links) > OCI_G(num_persistent)) {
-               zend_hash_apply_with_argument(&EG(regular_list), 
(apply_func_arg_t) php_oci_list_helper, (void *)le_connection TSRMLS_CC);
-       }
-       php_oci_cleanup_global_handles(TSRMLS_C);
-#endif
-
        return SUCCESS;
 }
 
@@ -1233,7 +1242,7 @@
        php_info_print_table_start();
        php_info_print_table_row(2, "OCI8 Support", "enabled");
        php_info_print_table_row(2, "Version", PHP_OCI8_VERSION);
-       php_info_print_table_row(2, "Revision", "$Revision: 
1.269.2.16.2.38.2.30 $");
+       php_info_print_table_row(2, "Revision", "$Revision: 
1.269.2.16.2.38.2.31 $");
 
        snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent));
        php_info_print_table_row(2, "Active Persistent Connections", buf);
@@ -3105,24 +3114,6 @@
        return OCI_SUCCESS;
 } /* }}} */
 
-#ifdef ZTS
-/* {{{ php_oci_list_helper()
- *
- *     Helper function to destroy data on thread shutdown in ZTS mode
- */
-static int php_oci_list_helper(zend_rsrc_list_entry *le, void *le_type 
TSRMLS_DC)
-{
-       int type = (int) le_type;
-
-       if (le->type == type) {
-               if (le->ptr != NULL && --le->refcount<=0) {
-                       return ZEND_HASH_APPLY_REMOVE;
-               }
-       }
-       return ZEND_HASH_APPLY_KEEP;
-} /* }}} */
-#endif
-
 #endif /* HAVE_OCI8 */
 
 /*
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/php_oci8_int.h?r1=1.11.2.6.2.21.2.12&r2=1.11.2.6.2.21.2.13&diff_format=u
Index: php-src/ext/oci8/php_oci8_int.h
diff -u php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.21.2.12 
php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.21.2.13
--- php-src/ext/oci8/php_oci8_int.h:1.11.2.6.2.21.2.12  Wed Dec 31 11:15:39 2008
+++ php-src/ext/oci8/php_oci8_int.h     Mon Mar  9 20:09:07 2009
@@ -25,7 +25,7 @@
    +----------------------------------------------------------------------+
 */
 
-/* $Id: php_oci8_int.h,v 1.11.2.6.2.21.2.12 2008/12/31 11:15:39 sebastian Exp 
$ */
+/* $Id: php_oci8_int.h,v 1.11.2.6.2.21.2.13 2009/03/09 20:09:07 sixd Exp $ */
 
 #if HAVE_OCI8
 # ifndef PHP_OCI8_INT_H
@@ -319,7 +319,7 @@
        } while (0)
 
 #define PHP_OCI_ZVAL_TO_CONNECTION(zval, connection) \
-       ZEND_FETCH_RESOURCE2(connection, php_oci_connection *, &zval, -1, "oci8 
connection", le_connection, le_pconnection);
+       ZEND_FETCH_RESOURCE2(connection, php_oci_connection *, &zval, -1, "oci8 
connection", le_connection, le_pconnection)
 
 #define PHP_OCI_ZVAL_TO_STATEMENT(zval, statement) \
        ZEND_FETCH_RESOURCE(statement, php_oci_statement *, &zval, -1, "oci8 
statement", le_statement)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/debug.phpt?r1=1.1.2.4.4.3&r2=1.1.2.4.4.4&diff_format=u
Index: php-src/ext/oci8/tests/debug.phpt
diff -u php-src/ext/oci8/tests/debug.phpt:1.1.2.4.4.3 
php-src/ext/oci8/tests/debug.phpt:1.1.2.4.4.4
--- php-src/ext/oci8/tests/debug.phpt:1.1.2.4.4.3       Thu Jun 19 19:56:11 2008
+++ php-src/ext/oci8/tests/debug.phpt   Mon Mar  9 20:09:07 2009
@@ -59,3 +59,9 @@
 OCI8 DEBUG: OCIHandleFree at (%s:%d) 
 OCI8 DEBUG: OCIHandleFree at (%s:%d) 
 Done
+OCI8 DEBUG: OCISessionPoolDestroy at (%s:%d) 
+OCI8 DEBUG: OCIHandleFree at (%s:%d) 
+OCI8 DEBUG: OCIHandleFree at (%s:%d) 
+OCI8 DEBUG: OCIHandleFree at (%s:%d) 
+OCI8 DEBUG: OCIHandleFree at (%s:%d) 
+OCI8 DEBUG: OCIHandleFree at (%s:%d)

http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/b47243_1.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/b47243_1.phpt
+++ php-src/ext/oci8/tests/b47243_1.phpt
--TEST--
Bug #47243 (Crash on exit with ZTS mode)
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php

require(dirname(__FILE__).'/connect.inc');

// Run Test

$s = oci_parse($c, "select cursor(select dummy from dual) from dual");
oci_execute($s);
oci_fetch_all($s, $r);

// No explicit free or close

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
===DONE===

http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/b47243_2.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/b47243_2.phpt
+++ php-src/ext/oci8/tests/b47243_2.phpt
--TEST--
Bug #47243 (Crash on exit with ZTS mode)
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php

require(dirname(__FILE__).'/connect.inc');

// Run Test

$s = oci_parse($c, "select cursor(select dummy from dual) from dual");
oci_execute($s);
oci_fetch_all($s, $r);

oci_free_statement($s);
// no explicit close

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
===DONE===

http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/tests/b47243_3.phpt?view=markup&rev=1.1
Index: php-src/ext/oci8/tests/b47243_3.phpt
+++ php-src/ext/oci8/tests/b47243_3.phpt
--TEST--
Bug #47243 (Crash on exit with ZTS mode)
--SKIPIF--
<?php if (!extension_loaded('oci8')) die ("skip no oci8 extension"); ?>
--FILE--
<?php

require(dirname(__FILE__).'/connect.inc');

// Run Test

$s = oci_parse($c, "select cursor(select dummy from dual) from dual");
oci_execute($s);
oci_fetch_all($s, $r);

// With explicit free and close
oci_free_statement($s);
oci_close($c);

?>
===DONE===
<?php exit(0); ?>
--EXPECTF--
===DONE===

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

Reply via email to