X-Git-Url: https://git.lttng.org/?p=lttng-tools.git;a=blobdiff_plain;f=hashtable%2Frculfhash.h;h=a3a7c7e9caecf4c81b7f8c83b1ae514b06947f46;hp=008b1d49f55ae86ae4bcdf86c2ce2a8c0a1c7617;hb=874d3f847b8053e38a50321b17abce4248ce6e53;hpb=d6b189345152f407360bc287997d38d30054bd2c diff --git a/hashtable/rculfhash.h b/hashtable/rculfhash.h index 008b1d49f..a3a7c7e9c 100644 --- a/hashtable/rculfhash.h +++ b/hashtable/rculfhash.h @@ -345,6 +345,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