#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;
}
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;
}
}
+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;
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);