29
29
#include "pdo/php_pdo_driver.h"
30
30
#include "php_pdo_oci.h"
31
31
#include "php_pdo_oci_int.h"
32
+ #ifdef ZTS
33
+ #include <TSRM/TSRM.h>
34
+ #endif
32
35
33
36
/* {{{ pdo_oci_functions[] */
34
37
const zend_function_entry pdo_oci_functions [] = {
@@ -52,7 +55,7 @@ zend_module_entry pdo_oci_module_entry = {
52
55
pdo_oci_functions ,
53
56
PHP_MINIT (pdo_oci ),
54
57
PHP_MSHUTDOWN (pdo_oci ),
55
- NULL ,
58
+ PHP_RINIT ( pdo_oci ) ,
56
59
NULL ,
57
60
PHP_MINFO (pdo_oci ),
58
61
PHP_PDO_OCI_VERSION ,
@@ -82,18 +85,48 @@ const ub4 PDO_OCI_INIT_MODE =
82
85
/* true global environment */
83
86
OCIEnv * pdo_oci_Env = NULL ;
84
87
88
+ #ifdef ZTS
89
+ /* lock for pdo_oci_Env initialization */
90
+ static MUTEX_T pdo_oci_env_mutex ;
91
+ #endif
92
+
85
93
/* {{{ PHP_MINIT_FUNCTION
86
94
*/
87
95
PHP_MINIT_FUNCTION (pdo_oci )
88
96
{
89
97
php_pdo_register_driver (& pdo_oci_driver );
90
98
99
+ // Defer OCI init to PHP_RINIT_FUNCTION because with php-fpm,
100
+ // NLS_LANG is not yet available here.
101
+
102
+ #ifdef ZTS
103
+ pdo_oci_env_mutex = tsrm_mutex_alloc ();
104
+ #endif
105
+
106
+ return SUCCESS ;
107
+ }
108
+ /* }}} */
109
+
110
+ /* {{{ PHP_RINIT_FUNCTION
111
+ */
112
+ PHP_RINIT_FUNCTION (pdo_oci )
113
+ {
114
+ if (!pdo_oci_Env ) {
115
+ #ifdef ZTS
116
+ tsrm_mutex_lock (pdo_oci_env_mutex );
117
+ if (!pdo_oci_Env ) { // double-checked locking idiom
118
+ #endif
91
119
#if HAVE_OCIENVCREATE
92
- OCIEnvCreate (& pdo_oci_Env , PDO_OCI_INIT_MODE , NULL , NULL , NULL , NULL , 0 , NULL );
120
+ OCIEnvCreate (& pdo_oci_Env , PDO_OCI_INIT_MODE , NULL , NULL , NULL , NULL , 0 , NULL );
93
121
#else
94
- OCIInitialize (PDO_OCI_INIT_MODE , NULL , NULL , NULL , NULL );
95
- OCIEnvInit (& pdo_oci_Env , OCI_DEFAULT , 0 , NULL );
122
+ OCIInitialize (PDO_OCI_INIT_MODE , NULL , NULL , NULL , NULL );
123
+ OCIEnvInit (& pdo_oci_Env , OCI_DEFAULT , 0 , NULL );
124
+ #endif
125
+ #ifdef ZTS
126
+ }
127
+ tsrm_mutex_unlock (pdo_oci_env_mutex );
96
128
#endif
129
+ }
97
130
98
131
return SUCCESS ;
99
132
}
@@ -104,7 +137,15 @@ PHP_MINIT_FUNCTION(pdo_oci)
104
137
PHP_MSHUTDOWN_FUNCTION (pdo_oci )
105
138
{
106
139
php_pdo_unregister_driver (& pdo_oci_driver );
107
- OCIHandleFree ((dvoid * )pdo_oci_Env , OCI_HTYPE_ENV );
140
+
141
+ if (pdo_oci_Env ) {
142
+ OCIHandleFree ((dvoid * )pdo_oci_Env , OCI_HTYPE_ENV );
143
+ }
144
+
145
+ #ifdef ZTS
146
+ tsrm_mutex_free (pdo_oci_env_mutex );
147
+ #endif
148
+
108
149
return SUCCESS ;
109
150
}
110
151
/* }}} */
0 commit comments