From 928da7104699a28ad1a934306d9d6cb7e63ddb18 Mon Sep 17 00:00:00 2001 From: Andi Gutmans Date: Wed, 18 Oct 2000 20:15:53 +0000 Subject: [PATCH] - Try #2. Wasn't allowed to delete in the previous manner because we were in the middle of an llist_apply() --- Zend/zend_extensions.c | 12 ++++-------- Zend/zend_llist.c | 18 ++++++++++++++++++ Zend/zend_llist.h | 1 + 3 files changed, 23 insertions(+), 8 deletions(-) diff --git a/Zend/zend_extensions.c b/Zend/zend_extensions.c index 6859f5f0c5..794728adb5 100644 --- a/Zend/zend_extensions.c +++ b/Zend/zend_extensions.c @@ -138,20 +138,16 @@ static void zend_extension_shutdown(zend_extension *extension) #endif } -static int zend_compare_extensions(zend_extension *extension1, zend_extension *extension2) -{ - return (extension1->handle == extension2->handle); -} - -static void zend_extension_startup(zend_extension *extension) +static int zend_extension_startup(zend_extension *extension) { #if ZEND_EXTENSIONS_SUPPORT if (extension->startup) { if (extension->startup(extension)!=SUCCESS) { - zend_llist_del_element(&zend_extensions, extension, (int(*)(void *, void *)) zend_compare_extensions); + return 1; } } #endif + return 0; } @@ -166,7 +162,7 @@ int zend_startup_extensions_mechanism() int zend_startup_extensions() { - zend_llist_apply(&zend_extensions, (void (*)(void *)) zend_extension_startup); + zend_llist_apply_with_del(&zend_extensions, (int (*)(void *)) zend_extension_startup); return SUCCESS; } diff --git a/Zend/zend_llist.c b/Zend/zend_llist.c index 5c10eee433..68d39282ff 100644 --- a/Zend/zend_llist.c +++ b/Zend/zend_llist.c @@ -139,6 +139,24 @@ ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src) } +ZEND_API void zend_llist_apply_with_del(zend_llist *l, int (*func)(void *data)) +{ + zend_llist_element *element, *next; + + element=l->head; + while (element) { + next = element->next; + if (func(element->data)) { + if (l->dtor) { + l->dtor(element->data); + pefree(element, l->persistent); + } + } + element = next; + } +} + + ZEND_API void zend_llist_apply(zend_llist *l, void (*func)(void *data)) { zend_llist_element *element; diff --git a/Zend/zend_llist.h b/Zend/zend_llist.h index 2e80331855..6b18bfba62 100644 --- a/Zend/zend_llist.h +++ b/Zend/zend_llist.h @@ -55,6 +55,7 @@ ZEND_API void zend_llist_clean(zend_llist *l); ZEND_API void zend_llist_remove_tail(zend_llist *l); ZEND_API void zend_llist_copy(zend_llist *dst, zend_llist *src); ZEND_API void zend_llist_apply(zend_llist *l, llist_apply_func_t); +ZEND_API void zend_llist_apply_with_del(zend_llist *l, int (*func)(void *data)); ZEND_API void zend_llist_apply_with_argument(zend_llist *l, llist_apply_with_arg_func_t, void *arg); ZEND_API void zend_llist_apply_with_arguments(zend_llist *l, llist_apply_with_args_func_t func, int num_args, ...); ZEND_API int zend_llist_count(zend_llist *l); -- 2.40.0