X-Git-Url: http://git.liburcu.org/?a=blobdiff_plain;f=urcu%2Frculfhash.h;h=37eaccf6b153c031ef29865d8ad8ec1a6e008ce5;hb=6d3201268d1d5f42ae79ddbca1d5a5b983cc49ba;hp=a1ae0f5a8fef9e80e39d8f21750005b565810cd7;hpb=04db56f85e2cd2abb05e4ef14990e99a1058d0df;p=urcu.git diff --git a/urcu/rculfhash.h b/urcu/rculfhash.h index a1ae0f5..37eaccf 100644 --- a/urcu/rculfhash.h +++ b/urcu/rculfhash.h @@ -26,13 +26,13 @@ */ #include +#include #include #ifdef __cplusplus extern "C" { #endif - /* * cds_lfht_node: Contains the next pointers and reverse-hash * value required for lookup and traversal of the hash table. @@ -49,7 +49,7 @@ extern "C" { * of the hash value for cds_lfht APIs. */ struct cds_lfht_node { - struct cds_lfht_node *next; /* ptr | DUMMY_FLAG | REMOVED_FLAG */ + struct cds_lfht_node *next; /* ptr | BUCKET_FLAG | REMOVED_FLAG */ unsigned long reverse_hash; } __attribute__((aligned(4))); @@ -362,6 +362,43 @@ int cds_lfht_del(struct cds_lfht *ht, struct cds_lfht_iter *iter); */ void cds_lfht_resize(struct cds_lfht *ht, unsigned long new_size); +/* + * Note: cds_lfht_for_each are safe for element removal during + * iteration. + */ +#define cds_lfht_for_each(ht, iter, node) \ + for (cds_lfht_first(ht, iter), \ + node = cds_lfht_iter_get_node(iter); \ + node != NULL; \ + cds_lfht_next(ht, iter), \ + node = cds_lfht_iter_get_node(iter)) + +#define cds_lfht_for_each_duplicate(ht, match, hash, key, iter, node) \ + for (cds_lfht_lookup(ht, match, hash, key, iter), \ + node = cds_lfht_iter_get_node(iter); \ + node != NULL; \ + cds_lfht_next_duplicate(ht, match, key, iter), \ + node = cds_lfht_iter_get_node(iter)) + +#define cds_lfht_for_each_entry(ht, iter, pos, member) \ + for (cds_lfht_first(ht, iter), \ + pos = caa_container_of(cds_lfht_iter_get_node(iter), \ + typeof(*(pos)), member); \ + &pos->member != NULL; \ + cds_lfht_next(ht, iter), \ + pos = caa_container_of(cds_lfht_iter_get_node(iter), \ + typeof(*(pos)), member)) + +#define cds_lfht_for_each_entry_duplicate(ht, match, hash, key, \ + iter, pos, member) \ + for (cds_lfht_lookup(ht, match, hash, key, iter), \ + pos = caa_container_of(cds_lfht_iter_get_node(iter), \ + typeof(*(pos)), member); \ + &pos->member != NULL; \ + cds_lfht_next_duplicate(ht, match, key, iter), \ + pos = caa_container_of(cds_lfht_iter_get_node(iter), \ + typeof(*(pos)), member)) + #ifdef __cplusplus } #endif