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,
rcu_register_thread();
for (;;) {
- unsigned long count, removed;
+ unsigned long count;
long approx_before, approx_after;
ssize_t len;
char buf[1];
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);
}
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");
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;
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;
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);
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);
}