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