rculfhash tests: add long hash chains tests
authorMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 29 Apr 2012 20:49:10 +0000 (16:49 -0400)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Sun, 29 Apr 2012 20:49:10 +0000 (16:49 -0400)
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
tests/test_urcu_hash.c
tests/test_urcu_hash.h

index 3c7cc350d4d02ef7a200893ec2843d2349e1024c..accf3c1ab1ff76a0e37b876da268ba690122e916 100644 (file)
@@ -114,6 +114,7 @@ unsigned long init_pool_size = DEFAULT_RAND_POOL,
        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];
 
@@ -290,6 +291,7 @@ printf("        [not -u nor -s] Add entries (supports redundant keys).\n");
        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");
 }
 
@@ -456,6 +458,9 @@ int main(int argc, char **argv)
                case 'U':
                        test_choice = TEST_HASH_UNIQUE;
                        break;
+               case 'C':
+                       nr_hash_chains = atol(argv[++i]);
+                       break;
                }
        }
 
@@ -528,6 +533,8 @@ int main(int argc, char **argv)
                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());
 
index a935e94b0a095bac4fccf9a693b18842d3f027d0..083e71c3185214b7f81dd607a5705217bd2705bb 100644 (file)
@@ -169,6 +169,8 @@ extern unsigned long init_pool_size,
        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)
@@ -323,7 +325,7 @@ void hashword2(
 
 #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;
 
@@ -332,7 +334,7 @@ unsigned long test_hash(const void *_key, size_t length, unsigned long seed)
 }
 #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;
@@ -351,6 +353,29 @@ unsigned long test_hash(const void *_key, size_t length, unsigned long seed)
 }
 #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);
 
This page took 0.027728 seconds and 4 git commands to generate.