From 8431fb17c2a3fe3732c2f8370152bb8715c1996a Mon Sep 17 00:00:00 2001 From: Lennart Poettering Date: Thu, 29 May 2008 15:16:58 +0000 Subject: allow on-the-fly deleting of hashmap entries wile we iterate through them git-svn-id: file:///home/lennart/svn/public/pulseaudio/trunk@2491 fefdeb5f-60dc-0310-8127-8f9354f1896f --- src/pulsecore/hashmap.c | 32 ++++++++++++++++++++++---------- src/pulsecore/hashmap.h | 7 ++++--- 2 files changed, 26 insertions(+), 13 deletions(-) (limited to 'src/pulsecore') diff --git a/src/pulsecore/hashmap.c b/src/pulsecore/hashmap.c index c9d5632c..7ca8d0e6 100644 --- a/src/pulsecore/hashmap.c +++ b/src/pulsecore/hashmap.c @@ -191,24 +191,36 @@ unsigned pa_hashmap_size(pa_hashmap *h) { } void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void **key) { + struct hashmap_entry *e; + pa_assert(h); pa_assert(state); - if (!*state) - *state = h->first_entry; + if (*state == (void*) -1) + goto at_end; + + if ((!*state && !h->first_entry)) + goto at_end; + + e = *state ? *state : h->first_entry; + + if (e->next) + *state = e->next; else - *state = ((struct hashmap_entry*) *state)->next; + *state = (void*) -1; - if (!*state) { - if (key) - *key = NULL; - return NULL; - } + if (key) + *key = e->key; + + return e->value; + +at_end: + *state = (void *) -1; if (key) - *key = ((struct hashmap_entry*) *state)->key; + *key = NULL; - return ((struct hashmap_entry*) *state)->value; + return NULL; } void* pa_hashmap_steal_first(pa_hashmap *h) { diff --git a/src/pulsecore/hashmap.h b/src/pulsecore/hashmap.h index 98df4502..6a5e0f24 100644 --- a/src/pulsecore/hashmap.h +++ b/src/pulsecore/hashmap.h @@ -51,9 +51,10 @@ unsigned pa_hashmap_size(pa_hashmap *h); /* May be used to iterate through the hashmap. Initially the opaque pointer *state has to be set to NULL. The hashmap may not be - modified during iteration. The key of the entry is returned in - *key, if key is non-NULL. After the last entry in the hashmap NULL - is returned. */ + modified during iteration -- except for deleting the current entry + via pa_hashmap_remove(). The key of the entry is returned in *key, + if key is non-NULL. After the last entry in the hashmap NULL is + returned. */ void *pa_hashmap_iterate(pa_hashmap *h, void **state, const void**key); void *pa_hashmap_steal_first(pa_hashmap *h); -- cgit