X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=tests%2Ftest_urcu_hash.c;h=8c6f0dac218a44f30b6bd16211fd0156e8fc3943;hb=caf3653dbe9dec81dc37c8e81267f27d3163dd19;hp=035e2eedf508433abd203030fe450d1e951e89bd;hpb=b99436d7323be9ad8513f94fd7be498ebc3136af;p=urcu.git diff --git a/tests/test_urcu_hash.c b/tests/test_urcu_hash.c index 035e2ee..8c6f0da 100644 --- a/tests/test_urcu_hash.c +++ b/tests/test_urcu_hash.c @@ -151,6 +151,7 @@ static unsigned long max_hash_buckets_size = (1UL << 20); static unsigned long init_populate; static int opt_auto_resize; static int add_only, add_unique, add_replace; +static const struct cds_lfht_mm_type *memory_backend; static unsigned long init_pool_offset, lookup_pool_offset, write_pool_offset; static unsigned long init_pool_size = DEFAULT_RAND_POOL, @@ -453,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]; @@ -469,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); } @@ -741,6 +742,7 @@ void show_usage(int argc, char **argv) printf(" [-i] Add only (no removal).\n"); printf(" [-k nr_nodes] Number of nodes to insert initially.\n"); printf(" [-A] Automatically resize hash table.\n"); + printf(" [-B order|chunk|mmap] Specify the memory backend.\n"); printf(" [-R offset] Lookup pool offset.\n"); printf(" [-S offset] Write pool offset.\n"); printf(" [-T offset] Init pool offset.\n"); @@ -761,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; @@ -873,6 +875,23 @@ int main(int argc, char **argv) case 'A': opt_auto_resize = 1; break; + case 'B': + if (argc < i + 2) { + show_usage(argc, argv); + return -1; + } + i++; + if (!strcmp("order", argv[i])) + memory_backend = &cds_lfht_mm_order; + else if (!strcmp("chunk", argv[i])) + memory_backend = &cds_lfht_mm_chunk; + else if (!strcmp("mmap", argv[i])) + memory_backend = &cds_lfht_mm_mmap; + else { + printf("Please specify memory backend with order|chunk|mmap.\n"); + exit(-1); + } + break; case 'R': lookup_pool_offset = atol(argv[++i]); break; @@ -978,15 +997,24 @@ int main(int argc, char **argv) err = create_all_cpu_call_rcu_data(0); assert(!err); + if (memory_backend) { + test_ht = _cds_lfht_new(init_hash_size, min_hash_alloc_size, + max_hash_buckets_size, + (opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0) | + CDS_LFHT_ACCOUNTING, memory_backend, + &rcu_flavor, NULL); + } else { + test_ht = cds_lfht_new(init_hash_size, min_hash_alloc_size, + max_hash_buckets_size, + (opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0) | + CDS_LFHT_ACCOUNTING, NULL); + } + /* - * Hash creation and population needs to be seen as a RCU reader + * Hash Population needs to be seen as a RCU reader * thread from the point of view of resize. */ rcu_register_thread(); - test_ht = cds_lfht_new(init_hash_size, min_hash_alloc_size, - max_hash_buckets_size, - (opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0) | - CDS_LFHT_ACCOUNTING, NULL); ret = populate_hash(); assert(!ret); @@ -1058,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); }