/* hardcoded number of CPUs */
#define NR_CPUS 16384
+#ifdef POISON_FREE
+#define poison_free(ptr) \
+ do { \
+ memset(ptr, 0x42, sizeof(*(ptr))); \
+ free(ptr); \
+ } while (0)
+#else
+#define poison_free(ptr) free(ptr)
+#endif
+
+
+
#if defined(_syscall0)
_syscall0(pid_t, gettid)
#elif defined(__NR_gettid)
static unsigned long init_hash_size = DEFAULT_HASH_SIZE;
static unsigned long init_populate;
static unsigned long rand_pool = DEFAULT_RAND_POOL;
+static int opt_auto_resize;
static int add_only, add_unique;
+static unsigned long init_pool_offset, lookup_pool_offset, write_pool_offset;
+
static inline void loop_sleep(unsigned long l)
{
while(l-- != 0)
for (;;) {
rcu_read_lock();
node = cds_lfht_lookup(test_ht,
- (void *)(unsigned long)(rand_r(&rand_lookup) % rand_pool),
+ (void *)(unsigned long)((rand_r(&rand_lookup) % rand_pool) + lookup_pool_offset),
sizeof(void *));
if (node == NULL)
lookup_fail++;
node = malloc(sizeof(struct cds_lfht_node));
rcu_read_lock();
cds_lfht_node_init(node,
- (void *)(unsigned long)(rand_r(&rand_lookup) % rand_pool),
+ (void *)(unsigned long)((rand_r(&rand_lookup) % rand_pool) + write_pool_offset),
sizeof(void *));
if (add_unique)
ret_node = cds_lfht_add_unique(test_ht, node);
/* May delete */
rcu_read_lock();
node = cds_lfht_lookup(test_ht,
- (void *)(unsigned long)(rand_r(&rand_lookup) % rand_pool),
+ (void *)(unsigned long)((rand_r(&rand_lookup) % rand_pool) + write_pool_offset),
sizeof(void *));
if (node)
ret = cds_lfht_remove(test_ht, node);
while (nr_add < init_populate) {
node = malloc(sizeof(struct cds_lfht_node));
cds_lfht_node_init(node,
- (void *)(unsigned long)(rand_r(&rand_lookup) % rand_pool),
+ (void *)(unsigned long)((rand_r(&rand_lookup) % rand_pool) + init_pool_offset),
sizeof(void *));
if (add_unique)
ret_node = cds_lfht_add_unique(test_ht, node);
printf(" [-u] Uniquify add.");
printf(" [-i] Add only (no removal).");
printf(" [-k nr_nodes] Number of nodes to insert initially.");
+ printf(" [-A] Automatically resize hash table.");
+ printf(" [-R offset] Lookup pool offset\n");
+ printf(" [-S offset] Write pool offset\n");
+ printf(" [-T offset] Init pool offset\n");
printf("\n");
}
case 'k':
init_populate = atol(argv[++i]);
break;
+ case 'A':
+ opt_auto_resize = 1;
+ break;
+ case 'R':
+ lookup_pool_offset = atol(argv[++i]);
+ break;
+ case 'S':
+ write_pool_offset = atol(argv[++i]);
+ break;
+ case 'T':
+ init_pool_offset = atol(argv[++i]);
+ break;
+
}
}
count_reader = malloc(sizeof(*count_reader) * nr_readers);
count_writer = malloc(sizeof(*count_writer) * nr_writers);
test_ht = cds_lfht_new(test_hash, test_compare, 0x42UL,
- init_hash_size, call_rcu, synchronize_rcu);
+ init_hash_size,
+ opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0,
+ call_rcu, synchronize_rcu, rcu_read_lock,
+ rcu_read_unlock, rcu_thread_offline,
+ rcu_thread_online);
ret = populate_hash();
assert(!ret);
err = create_all_cpu_call_rcu_data(0);
nr_writers, wdelay, rand_pool, tot_reads, tot_writes,
tot_reads + tot_writes, tot_add, tot_add_exist, tot_remove,
(long long) tot_add + init_populate - tot_remove - count);
+ free_all_cpu_call_rcu_data();
free(tid_reader);
free(tid_writer);
free(count_reader);