X-Git-Url: https://git.lttng.org/?a=blobdiff_plain;f=rculfhash.c;h=e379c7126629921a221e2f2971764c6380ce89ff;hb=1af6e26eb514ede8d278177e30213b9e0c7152d4;hp=8a9e0974926d7ce3973f40b92fb629eebc58e0f2;hpb=ed35e6d83818d603682c7adafe7f32f05826e204;p=urcu.git diff --git a/rculfhash.c b/rculfhash.c index 8a9e097..e379c71 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, @@ -1034,7 +1034,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 +1048,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 +1055,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); } /* @@ -1097,8 +1094,6 @@ void init_table_populate_partition(struct cds_lfht *ht, unsigned long i, bit_reverse_ulong(!i ? 0 : (1UL << (i - 1)) + j); (void) _cds_lfht_add(ht, !i ? 0 : (1UL << (i - 1)), new_node, ADD_DEFAULT, 1); - if (CMM_LOAD_SHARED(ht->in_progress_destroy)) - break; } ht->cds_lfht_rcu_read_unlock(); } @@ -1200,8 +1195,6 @@ void remove_table_partition(struct cds_lfht *ht, unsigned long i, bit_reverse_ulong(!i ? 0 : (1UL << (i - 1)) + j); (void) _cds_lfht_del(ht, !i ? 0 : (1UL << (i - 1)), fini_node, 1); - if (CMM_LOAD_SHARED(ht->in_progress_destroy)) - break; } ht->cds_lfht_rcu_read_unlock(); } @@ -1651,6 +1644,9 @@ void _do_cds_lfht_resize(struct cds_lfht *ht) * Resize table, re-do if the target size has changed under us. */ do { + assert(uatomic_read(&ht->in_progress_resize)); + if (CMM_LOAD_SHARED(ht->in_progress_destroy)) + break; ht->t.resize_initiated = 1; old_size = ht->t.size; new_size = CMM_LOAD_SHARED(ht->t.resize_target);