diff options
| author | Johannes Schlüter <johannes@php.net> | 2012-05-08 17:30:46 +0200 |
|---|---|---|
| committer | Johannes Schlüter <johannes@php.net> | 2012-05-08 17:30:46 +0200 |
| commit | 544c6f2f224586b24990b342b187a8ddf8c1aedf (patch) | |
| tree | 65c8863fa2f63588f98efaa96d42fe099af86580 /ext/mysqlnd | |
| parent | 6e96d7cd5ef255b1152ec8312145195dc4b3be6c (diff) | |
| parent | e8e661128a4dcee9d2f35ed3443d567ba2ad7870 (diff) | |
| download | php-git-544c6f2f224586b24990b342b187a8ddf8c1aedf.tar.gz | |
Merge branch 'PHP-5.4'
* PHP-5.4:
Fix #61704 (Crash apache, phpinfo() threading issue)
Fix folding marks
Diffstat (limited to 'ext/mysqlnd')
| -rw-r--r-- | ext/mysqlnd/mysqlnd_plugin.c | 27 | ||||
| -rw-r--r-- | ext/mysqlnd/php_mysqlnd.c | 24 |
2 files changed, 37 insertions, 14 deletions
diff --git a/ext/mysqlnd/mysqlnd_plugin.c b/ext/mysqlnd/mysqlnd_plugin.c index b295ad720d..2dbb57d1c8 100644 --- a/ext/mysqlnd/mysqlnd_plugin.c +++ b/ext/mysqlnd/mysqlnd_plugin.c @@ -65,7 +65,7 @@ static struct st_mysqlnd_typeii_plugin_example mysqlnd_example_plugin = }; -/* {{{ mysqlnd_plugin_subsystem_init */ +/* {{{ mysqlnd_example_plugin_end */ static enum_func_status mysqlnd_example_plugin_end(void * p TSRMLS_DC) { @@ -78,7 +78,7 @@ enum_func_status mysqlnd_example_plugin_end(void * p TSRMLS_DC) /* }}} */ -/* {{{ mysqlnd_plugin_subsystem_init */ +/* {{{ mysqlnd_example_plugin_register */ void mysqlnd_example_plugin_register(TSRMLS_D) { @@ -104,7 +104,7 @@ mysqlnd_plugin_subsystem_init(TSRMLS_D) /* }}} */ -/* {{{ mysqlnd_plugin_subsystem_init */ +/* {{{ mysqlnd_plugin_end_apply_func */ int mysqlnd_plugin_end_apply_func(void *pDest TSRMLS_DC) { @@ -136,7 +136,7 @@ PHPAPI unsigned int mysqlnd_plugin_register() /* }}} */ -/* {{{ mysqlnd_plugin_register */ +/* {{{ mysqlnd_plugin_register_ex */ PHPAPI unsigned int mysqlnd_plugin_register_ex(struct st_mysqlnd_plugin_header * plugin TSRMLS_DC) { if (plugin) { @@ -169,7 +169,24 @@ PHPAPI void * _mysqlnd_plugin_find(const char * const name TSRMLS_DC) /* {{{ _mysqlnd_plugin_apply_with_argument */ PHPAPI void _mysqlnd_plugin_apply_with_argument(apply_func_arg_t apply_func, void * argument TSRMLS_DC) { - zend_hash_apply_with_argument(&mysqlnd_registered_plugins, apply_func, argument TSRMLS_CC); + /* Note: We want to be thread-safe (read-only), so we can use neither + * zend_hash_apply_with_argument nor zend_hash_internal_pointer_reset and + * friends + */ + Bucket *p; + + p = mysqlnd_registered_plugins.pListHead; + while (p != NULL) { + int result = apply_func(p->pData, argument TSRMLS_CC); + + if (result & ZEND_HASH_APPLY_REMOVE) { + php_error_docref(NULL TSRMLS_CC, E_WARNING, "mysqlnd_plugin_apply_with_argument must not remove table entries"); + } + p = p->pListNext; + if (result & ZEND_HASH_APPLY_STOP) { + break; + } + } } /* }}} */ diff --git a/ext/mysqlnd/php_mysqlnd.c b/ext/mysqlnd/php_mysqlnd.c index 1022285ad7..20fcc5e7ad 100644 --- a/ext/mysqlnd/php_mysqlnd.c +++ b/ext/mysqlnd/php_mysqlnd.c @@ -135,16 +135,22 @@ mysqlnd_minfo_dump_loaded_plugins(void *pDest, void * buf TSRMLS_DC) /* }}} */ /* {{{ mysqlnd_minfo_dump_api_plugins */ -static int -mysqlnd_minfo_dump_api_plugins(void * pDest, void * buf TSRMLS_DC) +static void +mysqlnd_minfo_dump_api_plugins(smart_str * buffer TSRMLS_DC) { - smart_str * buffer = (smart_str *) buf; - MYSQLND_REVERSE_API * ext = *(MYSQLND_REVERSE_API **) pDest; - if (buffer->len) { - smart_str_appendc(buffer, ','); + HashTable *ht = mysqlnd_reverse_api_get_api_list(TSRMLS_C); + Bucket *p; + + p = ht->pListHead; + while(p != NULL) { + MYSQLND_REVERSE_API * ext = *(MYSQLND_REVERSE_API **) p->pData; + if (buffer->len) { + smart_str_appendc(buffer, ','); + } + smart_str_appends(buffer, ext->module->name); + + p = p->pListNext; } - smart_str_appends(buffer, ext->module->name); - return ZEND_HASH_APPLY_KEEP; } /* }}} */ @@ -189,7 +195,7 @@ PHP_MINFO_FUNCTION(mysqlnd) php_info_print_table_row(2, "Loaded plugins", tmp_str.c); smart_str_free(&tmp_str); - zend_hash_apply_with_argument(mysqlnd_reverse_api_get_api_list(TSRMLS_C), mysqlnd_minfo_dump_api_plugins, &tmp_str TSRMLS_CC); + mysqlnd_minfo_dump_api_plugins(&tmp_str TSRMLS_CC); smart_str_0(&tmp_str); php_info_print_table_row(2, "API Extensions", tmp_str.c); smart_str_free(&tmp_str); |
