rculfhash: simplify get_count_order()
[urcu.git] / rculfhash.c
index efb1b22ce566c494c78fe3f74cafc83b33d5a9d1..fe8beedd7a9119d6b88e9a5e3fddec4267fd22a9 100644 (file)
@@ -255,7 +255,7 @@ struct rcu_resize_work {
 };
 
 struct partition_resize_work {
-       struct rcu_head head;
+       pthread_t thread_id;
        struct cds_lfht *ht;
        unsigned long i, start, len;
        void (*fct)(struct cds_lfht *ht, unsigned long i,
@@ -446,24 +446,28 @@ unsigned int fls_ulong(unsigned long x)
 #endif
 }
 
+/*
+ * Return the minimum order for which x <= (1UL << order).
+ * Return -1 if x is 0.
+ */
 int get_count_order_u32(uint32_t x)
 {
-       int order;
+       if (!x)
+               return -1;
 
-       order = fls_u32(x) - 1;
-       if (x & (x - 1))
-               order++;
-       return order;
+       return fls_u32(x - 1);
 }
 
+/*
+ * Return the minimum order for which x <= (1UL << order).
+ * Return -1 if x is 0.
+ */
 int get_count_order_ulong(unsigned long x)
 {
-       int order;
+       if (!x)
+               return -1;
 
-       order = fls_ulong(x) - 1;
-       if (x & (x - 1))
-               order++;
-       return order;
+       return fls_ulong(x - 1);
 }
 
 #ifdef POISON_FREE
@@ -1034,7 +1038,6 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
        struct partition_resize_work *work;
        int thread, ret;
        unsigned long nr_threads;
-       pthread_t *thread_id;
 
        /*
         * Note: nr_cpus_mask + 1 is always power of 2.
@@ -1049,7 +1052,6 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
        }
        partition_len = len >> get_count_order_ulong(nr_threads);
        work = calloc(nr_threads, sizeof(*work));
-       thread_id = calloc(nr_threads, sizeof(*thread_id));
        assert(work);
        for (thread = 0; thread < nr_threads; thread++) {
                work[thread].ht = ht;
@@ -1057,16 +1059,15 @@ void partition_resize_helper(struct cds_lfht *ht, unsigned long i,
                work[thread].len = partition_len;
                work[thread].start = thread * partition_len;
                work[thread].fct = fct;
-               ret = pthread_create(&thread_id[thread], ht->resize_attr,
+               ret = pthread_create(&(work[thread].thread_id), ht->resize_attr,
                        partition_resize_thread, &work[thread]);
                assert(!ret);
        }
        for (thread = 0; thread < nr_threads; thread++) {
-               ret = pthread_join(thread_id[thread], NULL);
+               ret = pthread_join(work[thread].thread_id, NULL);
                assert(!ret);
        }
        free(work);
-       free(thread_id);
 }
 
 /*
@@ -1612,8 +1613,8 @@ void _do_cds_lfht_grow(struct cds_lfht *ht,
 
        old_order = get_count_order_ulong(old_size) + 1;
        new_order = get_count_order_ulong(new_size) + 1;
-       printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
-              old_size, old_order, new_size, new_order);
+       dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
+                  old_size, old_order, new_size, new_order);
        assert(new_size > old_size);
        init_table(ht, old_order, new_order - old_order);
 }
@@ -1628,8 +1629,8 @@ void _do_cds_lfht_shrink(struct cds_lfht *ht,
        new_size = max(new_size, MIN_TABLE_SIZE);
        old_order = get_count_order_ulong(old_size) + 1;
        new_order = get_count_order_ulong(new_size) + 1;
-       printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
-              old_size, old_order, new_size, new_order);
+       dbg_printf("resize from %lu (order %lu) to %lu (order %lu) buckets\n",
+                  old_size, old_order, new_size, new_order);
        assert(new_size < old_size);
 
        /* Remove and unlink all dummy nodes to remove. */
This page took 0.025017 seconds and 4 git commands to generate.