changed enumerator implementation to handle reentrant code
authorMartin Willi <martin@strongswan.org>
Tue, 1 Apr 2008 06:51:55 +0000 (06:51 -0000)
committerMartin Willi <martin@strongswan.org>
Tue, 1 Apr 2008 06:51:55 +0000 (06:51 -0000)
src/libstrongswan/utils/linked_list.c

index ee46b2b..cab6d86 100644 (file)
@@ -149,9 +149,9 @@ struct private_enumerator_t {
        enumerator_t enumerator;
        
        /**
-        * next item to enumerate
+        * associated linked list
         */
-       element_t *next;
+       private_linked_list_t *list;
        
        /**
         * current item
@@ -164,13 +164,23 @@ struct private_enumerator_t {
  */
 static bool enumerate(private_enumerator_t *this, void **item)
 {
-       if (this->next == NULL)
+       if (!this->current)
+       {
+               if (!this->list->first)
+               {
+                       return FALSE;
+               }
+               this->current = this->list->first;
+       }
+       else
        {
-               return FALSE;
+               if (!this->current->next)
+               {
+                       return FALSE;
+               }
+               this->current = this->current->next;
        }
-       *item = this->next->value;
-       this->current = this->next;
-       this->next = this->next->next;
+       *item = this->current->value;
        return TRUE;
 }
 
@@ -183,7 +193,7 @@ static enumerator_t* create_enumerator(private_linked_list_t *this)
        
        enumerator->enumerator.enumerate = (void*)enumerate;
        enumerator->enumerator.destroy = (void*)free;
-       enumerator->next = this->first;
+       enumerator->list = this;
        enumerator->current = NULL;
        
        return &enumerator->enumerator;
@@ -602,11 +612,13 @@ static int remove(private_linked_list_t *this, void *item,
  */
 static void remove_at(private_linked_list_t *this, private_enumerator_t *enumerator)
 {
+       element_t *current;
+
        if (enumerator->current)
        {
-               remove_element(this, enumerator->current);
-               enumerator->current = NULL;
-               enumerator->next = this->first;
+               current = enumerator->current;
+               enumerator->current = current->previous;
+               remove_element(this, current);
        }
 }