Fix: RCU hash table seed
authorDavid Goulet <dgoulet@efficios.com>
Tue, 6 Nov 2012 20:21:18 +0000 (15:21 -0500)
committerDavid Goulet <dgoulet@efficios.com>
Tue, 6 Nov 2012 20:21:18 +0000 (15:21 -0500)
Remove the dangerous static value 0x42UL. Use time(NULL) value to set
the new lttng_ht_seed variable when the hash table library constructor
is called.

Fixes #388

Signed-off-by: David Goulet <dgoulet@efficios.com>
src/common/consumer.c
src/common/hashtable/hashtable.c
src/common/hashtable/hashtable.h

index acbc6783b8f20cc4796526d1719d92e7a918cbc1..e66edee2b79609cdcb76c77bca74b04d97b50da9 100644 (file)
@@ -2754,7 +2754,7 @@ int consumer_data_pending(uint64_t id)
        ht = consumer_data.stream_list_ht;
 
        cds_lfht_for_each_entry_duplicate(ht->ht,
        ht = consumer_data.stream_list_ht;
 
        cds_lfht_for_each_entry_duplicate(ht->ht,
-                       ht->hash_fct((void *)((unsigned long) id), 0x42UL),
+                       ht->hash_fct((void *)((unsigned long) id), lttng_ht_seed),
                        ht->match_fct, (void *)((unsigned long) id),
                        &iter.iter, stream, node_session_id.node) {
                /* If this call fails, the stream is being used hence data pending. */
                        ht->match_fct, (void *)((unsigned long) id),
                        &iter.iter, stream, node_session_id.node) {
                /* If this call fails, the stream is being used hence data pending. */
index ed1d6d6d7695e86efd2fdd2c7e8b15aec7138cf1..24d579773e0ab26d89cfb5f078f84562ce4431df 100644 (file)
@@ -27,7 +27,7 @@
 #include "hashtable.h"
 #include "utils.h"
 
 #include "hashtable.h"
 #include "utils.h"
 
-#define HASH_SEED            0x42UL            /* The answer to life */
+unsigned long lttng_ht_seed;
 
 static unsigned long min_hash_alloc_size = 1;
 static unsigned long max_hash_buckets_size = 0;
 
 static unsigned long min_hash_alloc_size = 1;
 static unsigned long max_hash_buckets_size = 0;
@@ -163,7 +163,7 @@ void lttng_ht_lookup(struct lttng_ht *ht, void *key,
        assert(ht);
        assert(ht->ht);
 
        assert(ht);
        assert(ht->ht);
 
-       cds_lfht_lookup(ht->ht, ht->hash_fct(key, HASH_SEED),
+       cds_lfht_lookup(ht->ht, ht->hash_fct(key, lttng_ht_seed),
                        ht->match_fct, key, &iter->iter);
 }
 
                        ht->match_fct, key, &iter->iter);
 }
 
@@ -178,7 +178,7 @@ void lttng_ht_add_unique_str(struct lttng_ht *ht,
        assert(ht->ht);
        assert(node);
 
        assert(ht->ht);
        assert(node);
 
-       node_ptr = cds_lfht_add_unique(ht->ht, ht->hash_fct(node->key, HASH_SEED),
+       node_ptr = cds_lfht_add_unique(ht->ht, ht->hash_fct(node->key, lttng_ht_seed),
                        ht->match_fct, node->key, &node->node);
        assert(node_ptr == &node->node);
 }
                        ht->match_fct, node->key, &node->node);
        assert(node_ptr == &node->node);
 }
@@ -192,7 +192,7 @@ void lttng_ht_add_ulong(struct lttng_ht *ht, struct lttng_ht_node_ulong *node)
        assert(ht->ht);
        assert(node);
 
        assert(ht->ht);
        assert(node);
 
-       cds_lfht_add(ht->ht, ht->hash_fct((void *) node->key, HASH_SEED),
+       cds_lfht_add(ht->ht, ht->hash_fct((void *) node->key, lttng_ht_seed),
                        &node->node);
 }
 
                        &node->node);
 }
 
@@ -208,7 +208,7 @@ void lttng_ht_add_unique_ulong(struct lttng_ht *ht,
        assert(node);
 
        node_ptr = cds_lfht_add_unique(ht->ht,
        assert(node);
 
        node_ptr = cds_lfht_add_unique(ht->ht,
-                       ht->hash_fct((void *) node->key, HASH_SEED), ht->match_fct,
+                       ht->hash_fct((void *) node->key, lttng_ht_seed), ht->match_fct,
                        (void *) node->key, &node->node);
        assert(node_ptr == &node->node);
 }
                        (void *) node->key, &node->node);
        assert(node_ptr == &node->node);
 }
@@ -225,7 +225,7 @@ struct lttng_ht_node_ulong *lttng_ht_add_replace_ulong(struct lttng_ht *ht,
        assert(node);
 
        node_ptr = cds_lfht_add_replace(ht->ht,
        assert(node);
 
        node_ptr = cds_lfht_add_replace(ht->ht,
-                       ht->hash_fct((void *) node->key, HASH_SEED), ht->match_fct,
+                       ht->hash_fct((void *) node->key, lttng_ht_seed), ht->match_fct,
                        (void *) node->key, &node->node);
        if (!node_ptr) {
                return NULL;
                        (void *) node->key, &node->node);
        if (!node_ptr) {
                return NULL;
@@ -318,3 +318,12 @@ struct lttng_ht_node_ulong *lttng_ht_iter_get_node_ulong(
        }
        return caa_container_of(node, struct lttng_ht_node_ulong, node);
 }
        }
        return caa_container_of(node, struct lttng_ht_node_ulong, node);
 }
+
+/*
+ * lib constructor
+ */
+static void __attribute__((constructor)) _init()
+{
+       /* Init hash table seed */
+       lttng_ht_seed = (unsigned long) time(NULL);
+}
index 90b4412756cb9f6f0d93e25b752e232bb69399ee..4007a9c6c6b29696313415c60473f198cc859a6a 100644 (file)
@@ -23,6 +23,8 @@
 #include "rculfhash.h"
 #include "rculfhash-internal.h"
 
 #include "rculfhash.h"
 #include "rculfhash-internal.h"
 
+extern unsigned long lttng_ht_seed;
+
 typedef unsigned long (*hash_fct)(void *_key, unsigned long seed);
 typedef cds_lfht_match_fct hash_match_fct;
 
 typedef unsigned long (*hash_fct)(void *_key, unsigned long seed);
 typedef cds_lfht_match_fct hash_match_fct;
 
This page took 0.029086 seconds and 4 git commands to generate.