rculfhash: number of logically removed nodes should not appear in API
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 21 Dec 2011 13:16:41 +0000 (08:16 -0500)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Wed, 21 Dec 2011 13:16:41 +0000 (08:16 -0500)
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 <mathieu.desnoyers@efficios.com>
rculfhash.c
tests/test_urcu_hash.c
urcu/rculfhash.h

index 8f2d8e4480fda449fbe6dd9de2bb69a2659d8643..f214293196a6094958e8274e09aaf73bb627f276 100644 (file)
@@ -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) {
index c696533db612502c2af74cd3b0d2afb4b13d0670..8c6f0dac218a44f30b6bd16211fd0156e8fc3943 100644 (file)
@@ -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);
        }
index de34fae0b424b20a0b7d7538932376209a603969..6ea00de3557f381bcd7172b7a8260d85e9d54734 100644 (file)
@@ -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);
 
 /*
This page took 0.028702 seconds and 4 git commands to generate.