| Wez Furlong 2004-07-30, 3:55 pm |
| wez Fri Jul 30 11:05:38 2004 EDT
Modified files: (Branch: PHP_4_3)
/Zend zend_ini.c
Log:
MFH: zts fix for ini entries and dl()
http://cvs.php.net/diff.php/Zend/ze...2=1.23.2.4&ty=u
Index: Zend/zend_ini.c
diff -u Zend/zend_ini.c:1.23.2.3 Zend/zend_ini.c:1.23.2.4
--- Zend/zend_ini.c:1.23.2.3 Fri Jul 18 08:03:50 2003
+++ Zend/zend_ini.c Fri Jul 30 11:05:38 2004
@@ -141,10 +141,25 @@
zend_ini_entry *p = ini_entry;
zend_ini_entry *hashed_ini_entry;
zval default_value;
+ HashTable *directives = registered_zend_ini_directives;
+
+#ifdef ZTS
+ /* if we are called during the request, eg: from dl(),
+ * then we should not touch the global directives table,
+ * and should update the per-(request|thread) version instead.
+ * This solves two problems: one is that ini entries for dl()'d
+ * extensions will now work, and the second is that updating the
+ * global hash here from dl() is not mutex protected and can
+ * lead to death.
+ */
+ if (directives != EG(ini_directives)) {
+ directives = EG(ini_directives);
+ }
+#endif
while (p->name) {
p->module_number = module_number;
- if (zend_hash_add(registered_zend_ini_direc
tives, p->name, p->name_length, p, sizeof(zend_ini_entry), (void **) &hashed_ini_entry)==FAILURE) {
+ if (zend_hash_add(directives, p->name, p->name_length, p, sizeof(zend_ini_entry), (void **) &hashed_ini_entry)==FAILURE) {
zend_unregister_ini_entries(module_numbe
r TSRMLS_CC);
return FAILURE;
}
|