diff options
author | Ingmar Runge <ingmar.runge@sixt.com> | 2017-05-22 16:21:59 +0200 |
---|---|---|
committer | Tianfang Yang <tianfyan@php.net> | 2017-08-22 01:09:35 -0400 |
commit | 079bc324cd68532334a8c227d4aacb061f8bfe8c (patch) | |
tree | 183b3641a0ae5ca9235412ea98bb02e31e62f059 /ext/pdo_oci/pdo_oci.c | |
parent | 61538ebadc2ac80b29d6b7a9c355615fe0f40492 (diff) | |
download | php-git-079bc324cd68532334a8c227d4aacb061f8bfe8c.tar.gz |
Fixed bug #74631 (PDO_PCO with PHP-FPM: OCI environment initialized before PHP-FPM sets it up)
Diffstat (limited to 'ext/pdo_oci/pdo_oci.c')
-rw-r--r-- | ext/pdo_oci/pdo_oci.c | 51 |
1 files changed, 46 insertions, 5 deletions
diff --git a/ext/pdo_oci/pdo_oci.c b/ext/pdo_oci/pdo_oci.c index 37e930eb1c..dfb67d758d 100644 --- a/ext/pdo_oci/pdo_oci.c +++ b/ext/pdo_oci/pdo_oci.c @@ -29,6 +29,9 @@ #include "pdo/php_pdo_driver.h" #include "php_pdo_oci.h" #include "php_pdo_oci_int.h" +#ifdef ZTS +#include <TSRM/TSRM.h> +#endif /* {{{ pdo_oci_functions[] */ const zend_function_entry pdo_oci_functions[] = { @@ -52,7 +55,7 @@ zend_module_entry pdo_oci_module_entry = { pdo_oci_functions, PHP_MINIT(pdo_oci), PHP_MSHUTDOWN(pdo_oci), - NULL, + PHP_RINIT(pdo_oci), NULL, PHP_MINFO(pdo_oci), PHP_PDO_OCI_VERSION, @@ -82,18 +85,48 @@ const ub4 PDO_OCI_INIT_MODE = /* true global environment */ OCIEnv *pdo_oci_Env = NULL; +#ifdef ZTS +/* lock for pdo_oci_Env initialization */ +static MUTEX_T pdo_oci_env_mutex; +#endif + /* {{{ PHP_MINIT_FUNCTION */ PHP_MINIT_FUNCTION(pdo_oci) { php_pdo_register_driver(&pdo_oci_driver); + // Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm, + // NLS_LANG is not yet available here. + +#ifdef ZTS + pdo_oci_env_mutex = tsrm_mutex_alloc(); +#endif + + return SUCCESS; +} +/* }}} */ + +/* {{{ PHP_RINIT_FUNCTION + */ +PHP_RINIT_FUNCTION(pdo_oci) +{ + if (!pdo_oci_Env) { +#ifdef ZTS + tsrm_mutex_lock(pdo_oci_env_mutex); + if (!pdo_oci_Env) { // double-checked locking idiom +#endif #if HAVE_OCIENVCREATE - OCIEnvCreate(&pdo_oci_Env, PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL, 0, NULL); + OCIEnvCreate(&pdo_oci_Env, PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL, 0, NULL); #else - OCIInitialize(PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL); - OCIEnvInit(&pdo_oci_Env, OCI_DEFAULT, 0, NULL); + OCIInitialize(PDO_OCI_INIT_MODE, NULL, NULL, NULL, NULL); + OCIEnvInit(&pdo_oci_Env, OCI_DEFAULT, 0, NULL); +#endif +#ifdef ZTS + } + tsrm_mutex_unlock(pdo_oci_env_mutex); #endif + } return SUCCESS; } @@ -104,7 +137,15 @@ PHP_MINIT_FUNCTION(pdo_oci) PHP_MSHUTDOWN_FUNCTION(pdo_oci) { php_pdo_unregister_driver(&pdo_oci_driver); - OCIHandleFree((dvoid*)pdo_oci_Env, OCI_HTYPE_ENV); + + if (pdo_oci_Env) { + OCIHandleFree((dvoid*)pdo_oci_Env, OCI_HTYPE_ENV); + } + +#ifdef ZTS + tsrm_mutex_free(pdo_oci_env_mutex); +#endif + return SUCCESS; } /* }}} */ |