rculfhash: add CDS_LFHT_ACCOUNTING flag
authorLai Jiangshan <laijs@cn.fujitsu.com>
Fri, 28 Oct 2011 08:16:34 +0000 (10:16 +0200)
committerMathieu Desnoyers <mathieu.desnoyers@efficios.com>
Fri, 28 Oct 2011 08:16:34 +0000 (10:16 +0200)
[ Edit by Mathieu Desnoyers: fix null pointer in poison_free. ]

Signed-off-by: Lai Jiangshan <laijs@cn.fujitsu.com>
Signed-off-by: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
rculfhash.c
tests/test_urcu_hash.c
urcu/rculfhash.h

index 668f93672a17899e7fc27e9cd049e1ccf9350d74..d786a3da743881e5bc0b406d57dd88d5e915401e 100644 (file)
@@ -486,10 +486,12 @@ int get_count_order_ulong(unsigned long x)
 }
 
 #ifdef POISON_FREE
-#define poison_free(ptr)                               \
-       do {                                            \
-               memset(ptr, 0x42, sizeof(*(ptr)));      \
-               free(ptr);                              \
+#define poison_free(ptr)                                       \
+       do {                                                    \
+               if (ptr) {                                      \
+                       memset(ptr, 0x42, sizeof(*(ptr)));      \
+                       free(ptr);                              \
+               }                                               \
        } while (0)
 #else
 #define poison_free(ptr)       free(ptr)
@@ -530,7 +532,7 @@ static void ht_init_nr_cpus_mask(void)
 #endif /* #else #if defined(HAVE_SYSCONF) */
 
 static
-struct ht_items_count *alloc_split_items_count(void)
+void alloc_split_items_count(struct cds_lfht *ht)
 {
        struct ht_items_count *count;
 
@@ -543,13 +545,19 @@ struct ht_items_count *alloc_split_items_count(void)
        }
 
        assert(split_count_mask >= 0);
-       return calloc(split_count_mask + 1, sizeof(*count));
+
+       if (ht->flags & CDS_LFHT_ACCOUNTING) {
+               ht->split_count = calloc(split_count_mask + 1, sizeof(*count));
+               assert(ht->split_count);
+       } else {
+               ht->split_count = NULL;
+       }
 }
 
 static
-void free_split_items_count(struct ht_items_count *count)
+void free_split_items_count(struct cds_lfht *ht)
 {
-       poison_free(count);
+       poison_free(ht->split_count);
 }
 
 #if defined(HAVE_SCHED_GETCPU)
@@ -1334,7 +1342,7 @@ struct cds_lfht *_cds_lfht_new(cds_lfht_hash_fct hash_fct,
        ht->cds_lfht_rcu_register_thread = cds_lfht_rcu_register_thread;
        ht->cds_lfht_rcu_unregister_thread = cds_lfht_rcu_unregister_thread;
        ht->resize_attr = attr;
-       ht->split_count = alloc_split_items_count();
+       alloc_split_items_count(ht);
        /* this mutex should not nest in read-side C.S. */
        pthread_mutex_init(&ht->resize_mutex, NULL);
        ht->flags = flags;
@@ -1589,7 +1597,7 @@ int cds_lfht_destroy(struct cds_lfht *ht, pthread_attr_t **attr)
        ret = cds_lfht_delete_dummy(ht);
        if (ret)
                return ret;
-       free_split_items_count(ht->split_count);
+       free_split_items_count(ht);
        if (attr)
                *attr = ht->resize_attr;
        poison_free(ht);
@@ -1607,7 +1615,7 @@ void cds_lfht_count_nodes(struct cds_lfht *ht,
        unsigned long nr_dummy = 0;
 
        *approx_before = 0;
-       if (split_count_mask >= 0) {
+       if (ht->split_count) {
                int i;
 
                for (i = 0; i < split_count_mask + 1; i++) {
@@ -1637,7 +1645,7 @@ void cds_lfht_count_nodes(struct cds_lfht *ht,
        } while (!is_end(node));
        dbg_printf("number of dummy nodes: %lu\n", nr_dummy);
        *approx_after = 0;
-       if (split_count_mask >= 0) {
+       if (ht->split_count) {
                int i;
 
                for (i = 0; i < split_count_mask + 1; i++) {
index 70db8b3ca750f398f7314c9a6b794b3140d1bd20..9ae1fa0791cec5bbbf89e4513bd33a030977911d 100644 (file)
@@ -889,7 +889,8 @@ int main(int argc, char **argv)
        rcu_register_thread();
        test_ht = cds_lfht_new(test_hash, test_compare, 0x42UL,
                        init_hash_size, 1,
-                       opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0, NULL);
+                       (opt_auto_resize ? CDS_LFHT_AUTO_RESIZE : 0) |
+                       CDS_LFHT_ACCOUNTING, NULL);
        ret = populate_hash();
        assert(!ret);
 
index fd67b6b892654d7051ed97ddf442289ee824af11..9b961044c17330be4d310927b4b44dfb02d0369f 100644 (file)
@@ -94,6 +94,7 @@ void cds_lfht_node_init(struct cds_lfht_node *node, void *key,
  */
 enum {
        CDS_LFHT_AUTO_RESIZE = (1U << 0),
+       CDS_LFHT_ACCOUNTING = (1U << 1),
 };
 
 /*
This page took 0.028529 seconds and 4 git commands to generate.