]> granicus.if.org Git - php/commitdiff
- Try #2. Wasn't allowed to delete in the previous manner because we were
authorAndi Gutmans <andi@php.net>
Wed, 18 Oct 2000 20:15:53 +0000 (20:15 +0000)
committerAndi Gutmans <andi@php.net>
Wed, 18 Oct 2000 20:15:53 +0000 (20:15 +0000)
  in the middle of an llist_apply()

Zend/zend_extensions.c
Zend/zend_llist.c
Zend/zend_llist.h

index 6859f5f0c58fce2f8078d4c507921e44d7560a34..794728adb5cbde47e2a45915057bc72923b95134 100644 (file)
@@ -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;
 }
 
index 5c10eee433bf3b73438755755f0653967817793a..68d39282ff887f70dfa164203808b9700b1cc0c7 100644 (file)
@@ -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;
index 2e8033185586acb2b804041f137094571fc8ed7d..6b18bfba62354e45ef8f0bc6e0e5a1c29c547b30 100644 (file)
@@ -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);