sixd Mon Mar 9 20:07:39 2009 UTC
Added files:
/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:
Bug #47243 (Crash at shutdown on Windows)
http://cvs.php.net/viewvc.cgi/php-src/ext/oci8/oci8.c?r1=1.362&r2=1.363&diff_format=u
Index: php-src/ext/oci8/oci8.c
diff -u php-src/ext/oci8/oci8.c:1.362 php-src/ext/oci8/oci8.c:1.363
--- php-src/ext/oci8/oci8.c:1.362 Mon Mar 9 18:59:20 2009
+++ php-src/ext/oci8/oci8.c Mon Mar 9 20:07:39 2009
@@ -26,7 +26,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: oci8.c,v 1.362 2009/03/09 18:59:20 sixd Exp $ */
+/* $Id: oci8.c,v 1.363 2009/03/09 20:07:39 sixd Exp $ */
#ifdef HAVE_CONFIG_H
#include "config.h"
@@ -39,12 +39,17 @@
#if HAVE_OCI8
+#if PHP_MAJOR_VERSION < 6
+#error This version of the PHP OCI8 extension is not compatible with PHP 5 or
earlier
+#endif
+
#include "php_oci8.h"
#include "php_oci8_int.h"
#include "zend_hash.h"
ZEND_DECLARE_MODULE_GLOBALS(oci)
static PHP_GINIT_FUNCTION(oci);
+static PHP_GSHUTDOWN_FUNCTION(oci);
/* True globals, no need for thread safety */
int le_connection;
@@ -88,9 +93,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);
@@ -813,7 +815,7 @@
PHP_OCI8_VERSION,
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
};
@@ -932,6 +934,16 @@
}
/* }}} */
+/* {{{ PHP_GSHUTDOWN_FUNCTION
+ *
+ * Called for thread shutdown in ZTS, after module shutdown for non-ZTS
+ */
+static PHP_GSHUTDOWN_FUNCTION(oci)
+{
+ php_oci_cleanup_global_handles(TSRMLS_C);
+}
+/* }}} */
+
PHP_MINIT_FUNCTION(oci)
{
zend_class_entry oci_lob_class_entry;
@@ -1051,36 +1063,17 @@
UNREGISTER_INI_ENTRIES();
-#ifndef ZTS
- php_oci_cleanup_global_handles(TSRMLS_C);
-#endif
-
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;
}
@@ -1091,7 +1084,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.362 $");
+ php_info_print_table_row(2, "Revision", "$Revision: 1.363 $");
snprintf(buf, sizeof(buf), "%ld", OCI_G(num_persistent));
php_info_print_table_row(2, "Active Persistent Connections", buf);
@@ -3017,24 +3010,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.47&r2=1.48&diff_format=u
Index: php-src/ext/oci8/php_oci8_int.h
diff -u php-src/ext/oci8/php_oci8_int.h:1.47
php-src/ext/oci8/php_oci8_int.h:1.48
--- php-src/ext/oci8/php_oci8_int.h:1.47 Wed Dec 31 11:12:33 2008
+++ php-src/ext/oci8/php_oci8_int.h Mon Mar 9 20:07:39 2009
@@ -25,7 +25,7 @@
+----------------------------------------------------------------------+
*/
-/* $Id: php_oci8_int.h,v 1.47 2008/12/31 11:12:33 sebastian Exp $ */
+/* $Id: php_oci8_int.h,v 1.48 2009/03/09 20:07:39 sixd Exp $ */
#if HAVE_OCI8
# ifndef PHP_OCI8_INT_H
@@ -329,7 +329,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.8&r2=1.9&diff_format=u
Index: php-src/ext/oci8/tests/debug.phpt
diff -u php-src/ext/oci8/tests/debug.phpt:1.8
php-src/ext/oci8/tests/debug.phpt:1.9
--- php-src/ext/oci8/tests/debug.phpt:1.8 Thu Jun 19 20:24:00 2008
+++ php-src/ext/oci8/tests/debug.phpt Mon Mar 9 20:07:39 2009
@@ -29,7 +29,6 @@
?>
--EXPECTF--
-OCI8 DEBUG: OCINlsEnvironmentVariableGet at (%s:%d)
OCI8 DEBUG L1: Got NO cached connection at (%s:%d)
OCI8 DEBUG: OCIEnvNlsCreate at (%s:%d)
OCI8 DEBUG: OCIHandleAlloc at (%s:%d)
@@ -59,3 +58,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