X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=blobdiff_plain;f=rculfhash.c;h=fe8beedd7a9119d6b88e9a5e3fddec4267fd22a9;hp=efb1b22ce566c494c78fe3f74cafc83b33d5a9d1;hb=920f8ef668b03c65ca414bd6d53db314da920d1f;hpb=dc35de0cb35eb2866d5d0d7eb87c7a249ed072c9 diff --git a/rculfhash.c b/rculfhash.c index efb1b22..fe8beed 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -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. */