1 #include <glib/gmessages.h>
2 #include <glib/gslist.h>
4 #include "spi-private.h"
11 static GSList *working_list = NULL; /* of Iteration */
14 * deletes an element from the list - in a re-entrant
15 * safe fashion; advances the element pointer to the next
19 spi_re_entrant_list_delete_link (GList * const *element_ptr)
26 g_return_if_fail (element_ptr != NULL);
28 element = *element_ptr;
29 g_return_if_fail (element != NULL);
32 first_item = (element->prev == NULL);
34 g_list_remove_link (NULL, element);
36 for (l = working_list; l; l = l->next)
38 Iteration *i = l->data;
40 if (i->iterator == element)
45 if (first_item && *(i->list) == element)
51 g_list_free_1 (element);
55 spi_re_entrant_list_foreach (GList **list,
69 working_list = g_slist_prepend (working_list, &i);
72 GList *l = i.iterator;
74 func (&i.iterator, user_data);
77 i.iterator = i.iterator->next;
80 working_list = g_slist_remove (working_list, &i);