diff options
author | David 'Digit' Turner <digit@android.com> | 2010-11-18 16:06:27 +0100 |
---|---|---|
committer | David 'Digit' Turner <digit@android.com> | 2010-11-18 16:06:27 +0100 |
commit | 347753be1d6bb07249641c84c3c582113af81941 (patch) | |
tree | 564b5c21a757454895b89b9dc74fcb0bf320da66 /android/utils/refset.h | |
parent | a20ae2d2f20ccbb16b58e6e45955d4f97c4dbd50 (diff) | |
download | external_qemu-347753be1d6bb07249641c84c3c582113af81941.zip external_qemu-347753be1d6bb07249641c84c3c582113af81941.tar.gz external_qemu-347753be1d6bb07249641c84c3c582113af81941.tar.bz2 |
Allow safe deletion during iteration of an ARefSet.
+ make AREFSET_FOREACH take the name of an existing type variable
which avoids an annoying type-cast in each statement.
Change-Id: Icf9d886601a9876fa29c15eb0e60a9bf6c8ec163
Diffstat (limited to 'android/utils/refset.h')
-rw-r--r-- | android/utils/refset.h | 10 |
1 files changed, 9 insertions, 1 deletions
diff --git a/android/utils/refset.h b/android/utils/refset.h index d734999..4db9b2b 100644 --- a/android/utils/refset.h +++ b/android/utils/refset.h @@ -20,6 +20,7 @@ typedef struct { AVECTOR_DECL(void*,buckets); + int iteration; } ARefSet; AINLINED void @@ -38,6 +39,7 @@ AINLINED void arefSet_clear( ARefSet* s ) { AVECTOR_CLEAR(s,buckets); + s->iteration = 0; } AINLINED int @@ -50,19 +52,25 @@ extern ABool arefSet_has( ARefSet* s, void* item ); extern void arefSet_add( ARefSet* s, void* item ); extern void arefSet_del( ARefSet* s, void* item ); +extern void _arefSet_removeDeferred( ARefSet* s ); + #define AREFSET_DELETED ((void*)~(size_t)0) #define AREFSET_FOREACH(_set,_item,_statement) \ do { \ int __refset_nn = 0; \ int __refset_max = (_set)->max_buckets; \ + (_set)->iteration += 2; \ for ( ; __refset_nn < __refset_max; __refset_nn++ ) { \ void* __refset_item = (_set)->buckets[__refset_nn]; \ if (__refset_item == NULL || __refset_item == AREFSET_DELETED) \ continue; \ - void* _item = __refset_item; \ + _item = __refset_item; \ _statement; \ } \ + (_set)->iteration -= 2; \ + if ((_set)->iteration == 1) \ + _arefSet_removeDeferred(_set); \ } while (0) #endif /* _ANDROID_UTILS_REFSET_H */ |