lookup_pool_size = DEFAULT_RAND_POOL,
write_pool_size = DEFAULT_RAND_POOL;
int validate_lookup;
+unsigned long nr_hash_chains; /* 0: normal table, other: number of hash chains */
int count_pipe[2];
printf(" [-O size] Init pool size.\n");
printf(" [-V] Validate lookups of init values (use with filled init pool, same lookup range, with different write range).\n");
printf(" [-U] Uniqueness test.\n");
+ printf(" [-C] Number of hash chains.\n");
printf("\n\n");
}
case 'U':
test_choice = TEST_HASH_UNIQUE;
break;
+ case 'C':
+ nr_hash_chains = atol(argv[++i]);
+ break;
}
}
lookup_pool_offset, lookup_pool_size);
printf_verbose("Update pool size offset %lu size %lu.\n",
write_pool_offset, write_pool_size);
+ printf_verbose("Number of hash chains: %lu.\n",
+ nr_hash_chains);
printf_verbose("thread %-6s, thread id : %lx, tid %lu\n",
"main", pthread_self(), (unsigned long)gettid());
write_pool_size;
extern int validate_lookup;
+extern unsigned long nr_hash_chains;
+
extern int count_pipe[2];
static inline void loop_sleep(unsigned long l)
#if (CAA_BITS_PER_LONG == 32)
static inline
-unsigned long test_hash(const void *_key, size_t length, unsigned long seed)
+unsigned long test_hash_mix(const void *_key, size_t length, unsigned long seed)
{
unsigned int key = (unsigned int) _key;
}
#else
static inline
-unsigned long test_hash(const void *_key, size_t length, unsigned long seed)
+unsigned long test_hash_mix(const void *_key, size_t length, unsigned long seed)
{
union {
uint64_t v64;
}
#endif
+/*
+ * Hash function with nr_hash_chains != 0 for testing purpose only!
+ * Creates very long hash chains, deteriorating the hash table into a
+ * few linked lists, depending on the nr_hash_chains value. The purpose
+ * of this test is to check how the hash table behaves with hash chains
+ * containing different values, which is a rare case in a normal hash
+ * table.
+ */
+static inline
+unsigned long test_hash(const void *_key, size_t length,
+ unsigned long seed)
+{
+ if (nr_hash_chains == 0) {
+ return test_hash_mix(_key, length, seed);
+ } else {
+ unsigned long v;
+
+ assert(length == sizeof(unsigned long));
+ v = (unsigned long) _key;
+ return v % nr_hash_chains;
+ }
+}
+
unsigned long test_compare(const void *key1, size_t key1_len,
const void *key2, size_t key2_len);