From: Mathieu Desnoyers Date: Wed, 21 Dec 2011 13:16:41 +0000 (-0500) Subject: rculfhash: number of logically removed nodes should not appear in API X-Git-Tag: v0.7.0~43^2~9 X-Git-Url: https://git.lttng.org./?a=commitdiff_plain;h=caf3653dbe9dec81dc37c8e81267f27d3163dd19;p=userspace-rcu.git rculfhash: number of logically removed nodes should not appear in API This is an implementation artefact that should not appear in the API. So only count the non-removed nodes. Print a debug message showing the number of logically removed nodes instead within the count nodes function. Signed-off-by: Mathieu Desnoyers --- diff --git a/rculfhash.c b/rculfhash.c index 8f2d8e4..f214293 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -1600,11 +1600,10 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr) void cds_lfht_count_nodes(struct cds_lfht *ht, long *approx_before, unsigned long *count, - unsigned long *removed, long *approx_after) { struct cds_lfht_node *node, *next; - unsigned long nr_bucket = 0; + unsigned long nr_bucket = 0, nr_removed = 0; *approx_before = 0; if (ht->split_count) { @@ -1617,7 +1616,6 @@ void cds_lfht_count_nodes(struct cds_lfht *ht, } *count = 0; - *removed = 0; /* Count non-bucket nodes in the table */ node = bucket_at(ht, 0); @@ -1625,7 +1623,7 @@ void cds_lfht_count_nodes(struct cds_lfht *ht, next = rcu_dereference(node->next); if (is_removed(next)) { if (!is_bucket(next)) - (*removed)++; + (nr_removed)++; else (nr_bucket)++; } else if (!is_bucket(next)) @@ -1634,6 +1632,7 @@ void cds_lfht_count_nodes(struct cds_lfht *ht, (nr_bucket)++; node = clear_flag(next); } while (!is_end(node)); + dbg_printf("number of logically removed nodes: %lu\n", nr_removed); dbg_printf("number of bucket nodes: %lu\n", nr_bucket); *approx_after = 0; if (ht->split_count) { diff --git a/tests/test_urcu_hash.c b/tests/test_urcu_hash.c index c696533..8c6f0da 100644 --- a/tests/test_urcu_hash.c +++ b/tests/test_urcu_hash.c @@ -454,7 +454,7 @@ void *thr_count(void *arg) rcu_register_thread(); for (;;) { - unsigned long count, removed; + unsigned long count; long approx_before, approx_after; ssize_t len; char buf[1]; @@ -470,15 +470,15 @@ void *thr_count(void *arg) printf("Counting nodes... "); fflush(stdout); rcu_read_lock(); - cds_lfht_count_nodes(test_ht, &approx_before, &count, &removed, + cds_lfht_count_nodes(test_ht, &approx_before, &count, &approx_after); rcu_read_unlock(); printf("done.\n"); printf("Approximation before node accounting: %ld nodes.\n", approx_before); printf("Accounting of nodes in the hash table: " - "%lu nodes + %lu logically removed.\n", - count, removed); + "%lu nodes.\n", + count); printf("Approximation after node accounting: %ld nodes.\n", approx_after); } @@ -763,7 +763,7 @@ int main(int argc, char **argv) struct wr_count *count_writer; unsigned long long tot_reads = 0, tot_writes = 0, tot_add = 0, tot_add_exist = 0, tot_remove = 0; - unsigned long count, removed; + unsigned long count; long approx_before, approx_after; int i, a, ret; struct sigaction act; @@ -1086,18 +1086,17 @@ int main(int argc, char **argv) rcu_thread_online(); rcu_read_lock(); printf("Counting nodes... "); - cds_lfht_count_nodes(test_ht, &approx_before, &count, &removed, - &approx_after); + cds_lfht_count_nodes(test_ht, &approx_before, &count, &approx_after); printf("done.\n"); test_delete_all_nodes(test_ht); rcu_read_unlock(); rcu_thread_offline(); - if (count || removed) { + if (count) { printf("Approximation before node accounting: %ld nodes.\n", approx_before); printf("Nodes deleted from hash table before destroy: " - "%lu nodes + %lu logically removed.\n", - count, removed); + "%lu nodes.\n", + count); printf("Approximation after node accounting: %ld nodes.\n", approx_after); } diff --git a/urcu/rculfhash.h b/urcu/rculfhash.h index de34fae..6ea00de 100644 --- a/urcu/rculfhash.h +++ b/urcu/rculfhash.h @@ -182,7 +182,6 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr); * @ht: the hash table. * @split_count_before: Sample the node count split-counter before traversal. * @count: Traverse the hash table, count the number of nodes observed. - * @removed: Number of logically removed nodes observed during traversal. * @split_count_after: Sample the node count split-counter after traversal. * * Call with rcu_read_lock held. @@ -191,7 +190,6 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr); void cds_lfht_count_nodes(struct cds_lfht *ht, long *split_count_before, unsigned long *count, - unsigned long *removed, long *split_count_after); /*