X-Git-Url: https://git.liburcu.org/?a=blobdiff_plain;f=tests%2Ftest_urcu_hash.c;h=d6464b4b1c23dfb9714acd2053f1e29eb1099bee;hb=6b262fd76774cdd6c7ec62d2a74515d9a28c2317;hp=d2dd4889f70d45361a6a88c84efea516f13cece8;hpb=7ed7682ffb933c7376830bb73b7f5701e566a559;p=urcu.git diff --git a/tests/test_urcu_hash.c b/tests/test_urcu_hash.c index d2dd488..d6464b4 100644 --- a/tests/test_urcu_hash.c +++ b/tests/test_urcu_hash.c @@ -397,7 +397,8 @@ void *thr_count(void *arg) rcu_register_thread(); for (;;) { - unsigned long count, removed, approx_before, approx_after; + unsigned long count, removed; + long approx_before, approx_after; ssize_t len; char buf[1]; @@ -416,12 +417,12 @@ void *thr_count(void *arg) &approx_after); rcu_read_unlock(); printf("done.\n"); - printf("Approximation before node accounting: %lu nodes.\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); - printf("Approximation after node accounting: %lu nodes.\n", + printf("Approximation after node accounting: %ld nodes.\n", approx_after); } rcu_unregister_thread(); @@ -514,15 +515,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); } @@ -544,13 +545,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 @@ -614,7 +612,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); } @@ -672,7 +670,8 @@ 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, approx_before, approx_after; + unsigned long count, removed; + long approx_before, approx_after; int i, a, ret; struct sigaction act; unsigned int remain; @@ -870,7 +869,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,20 +932,23 @@ int main(int argc, char **argv) printf("Counting nodes... "); fflush(stdout); + rcu_thread_online(); + rcu_read_lock(); cds_lfht_count_nodes(test_ht, &approx_before, &count, &removed, &approx_after); + rcu_read_unlock(); + rcu_thread_offline(); printf("done.\n"); if (count || removed) { - printf("Approximation before node accounting: %lu nodes.\n", + printf("Approximation before node accounting: %ld nodes.\n", approx_before); printf("WARNING: nodes left in the hash table upon destroy: " "%lu nodes + %lu logically removed.\n", count, removed); - printf("Approximation after node accounting: %lu nodes.\n", + 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 @@ -960,6 +963,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);