/* * Get first node in the hashtable. */ void lttng_ht_get_first(struct lttng_ht *ht, struct lttng_ht_iter *iter) { assert(ht); assert(ht->ht); assert(iter); cds_lfht_first(ht->ht, &iter->iter); }
void UA_NodeStore_delete(UA_NodeStore *ns) { struct cds_lfht *ht = ns->ht; struct cds_lfht_iter iter; rcu_read_lock(); cds_lfht_first(ht, &iter); while(iter.node) { if(!cds_lfht_del(ht, iter.node)) { struct nodeEntry *entry = (struct nodeEntry*) ((uintptr_t)iter.node - offsetof(struct nodeEntry, htn)); call_rcu(&entry->rcu_head, markDead); } cds_lfht_next(ht, &iter); } rcu_read_unlock(); cds_lfht_destroy(ht, NULL); UA_free(ns); }
void UA_NodeStore_iterate(const UA_NodeStore *ns, UA_NodeStore_nodeVisitor visitor) { struct cds_lfht *ht = ns->ht; struct cds_lfht_iter iter; rcu_read_lock(); cds_lfht_first(ht, &iter); while(iter.node != NULL) { struct nodeEntry *found_entry = (struct nodeEntry *)cds_lfht_iter_get_node(&iter); uatomic_inc(&found_entry->refcount); const UA_Node *node = &found_entry->node; rcu_read_unlock(); visitor(node); UA_NodeStore_release((const UA_Node *)node); rcu_read_lock(); cds_lfht_next(ht, &iter); } rcu_read_unlock(); }