rculfhash test: fix 32-bit hash
[urcu.git] / tests / test_urcu_hash.c
index 600b1f973f6ec997f4cd51a90771b7e36dda9077..cbbddc8c8cef72d9d59a1ee08f1b6e970748bd69 100644 (file)
@@ -350,10 +350,9 @@ static
 unsigned long test_hash(void *_key, size_t length, unsigned long seed)
 {
        unsigned long key = (unsigned long) _key;
-       unsigned long v;
 
        assert(length == sizeof(unsigned long));
-       return hash_u32(&v, 1, seed);
+       return hash_u32(&key, 1, seed);
 }
 #else
 static
@@ -515,15 +514,15 @@ void *thr_writer(void *_count)
                if ((addremove == AR_ADD || add_only)
                                || (addremove == AR_RANDOM && rand_r(&rand_lookup) & 1)) {
                        node = malloc(sizeof(struct cds_lfht_node));
-                       rcu_read_lock();
                        cds_lfht_node_init(node,
                                (void *)(((unsigned long) rand_r(&rand_lookup) % write_pool_size) + write_pool_offset),
                                sizeof(void *));
+                       rcu_read_lock();
                        if (add_unique) {
                                ret_node = cds_lfht_add_unique(test_ht, node);
                        } else {
                                if (add_replace)
-                                       ret_node = cds_lfht_replace(test_ht, node);
+                                       ret_node = cds_lfht_add_replace(test_ht, node);
                                else
                                        cds_lfht_add(test_ht, node);
                        }
@@ -545,13 +544,10 @@ void *thr_writer(void *_count)
                        cds_lfht_lookup(test_ht,
                                (void *)(((unsigned long) rand_r(&rand_lookup) % write_pool_size) + write_pool_offset),
                                sizeof(void *), &iter);
-                       node = cds_lfht_iter_get_node(&iter);
-                       if (node)
-                               ret = cds_lfht_del(test_ht, node);
-                       else
-                               ret = -ENOENT;
+                       ret = cds_lfht_del(test_ht, &iter);
                        rcu_read_unlock();
                        if (ret == 0) {
+                               node = cds_lfht_iter_get_node(&iter);
                                call_rcu(&node->head, free_node_cb);
                                nr_del++;
                        } else
@@ -615,7 +611,7 @@ static int populate_hash(void)
                        ret_node = cds_lfht_add_unique(test_ht, node);
                } else {
                        if (add_replace)
-                               ret_node = cds_lfht_replace(test_ht, node);
+                               ret_node = cds_lfht_add_replace(test_ht, node);
                        else
                                cds_lfht_add(test_ht, node);
                }
@@ -636,6 +632,26 @@ static int populate_hash(void)
        return 0;
 }
 
+static
+void test_delete_all_nodes(struct cds_lfht *ht)
+{
+       struct cds_lfht_iter iter;
+       struct cds_lfht_node *node;
+       unsigned long count = 0;
+
+       cds_lfht_first(ht, &iter);
+       while ((node = cds_lfht_iter_get_node(&iter)) != NULL) {
+               int ret;
+
+               ret = cds_lfht_del(test_ht, &iter);
+               assert(!ret);
+               call_rcu(&node->head, free_node_cb);
+               cds_lfht_next(ht, &iter);
+               count++;
+       }
+       printf("deleted %lu nodes.\n", count);
+}
+
 void show_usage(int argc, char **argv)
 {
        printf("Usage : %s nr_readers nr_writers duration (s)\n", argv[0]);
@@ -872,7 +888,8 @@ int main(int argc, char **argv)
                        opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0, NULL);
        ret = populate_hash();
        assert(!ret);
-       rcu_unregister_thread();
+
+       rcu_thread_offline();
 
        next_aff = 0;
 
@@ -932,22 +949,26 @@ int main(int argc, char **argv)
        if (err != 0)
                exit(1);
 
-       printf("Counting nodes... ");
        fflush(stdout);
+       rcu_thread_online();
+       rcu_read_lock();
+       printf("Counting nodes... ");
        cds_lfht_count_nodes(test_ht, &approx_before, &count, &removed,
                &approx_after);
        printf("done.\n");
+       test_delete_all_nodes(test_ht);
+       rcu_read_unlock();
+       rcu_thread_offline();
        if (count || removed) {
                printf("Approximation before node accounting: %ld nodes.\n",
                        approx_before);
-               printf("WARNING: nodes left in the hash table upon destroy: "
+               printf("Nodes deleted from hash table before destroy: "
                        "%lu nodes + %lu logically removed.\n",
                        count, removed);
                printf("Approximation after node accounting: %ld nodes.\n",
                        approx_after);
        }
        ret = cds_lfht_destroy(test_ht, NULL);
-
        if (ret)
                printf_verbose("final delete aborted\n");
        else
@@ -962,6 +983,7 @@ int main(int argc, char **argv)
                nr_writers, wdelay, tot_reads, tot_writes,
                tot_reads + tot_writes, tot_add, tot_add_exist, tot_remove,
                (long long) tot_add + init_populate - tot_remove - count);
+       rcu_unregister_thread();
        free_all_cpu_call_rcu_data();
        free(tid_reader);
        free(tid_writer);
This page took 0.023981 seconds and 4 git commands to generate.