From: Lai Jiangshan Date: Tue, 20 Dec 2011 15:32:48 +0000 (-0500) Subject: simplify the deletion for bucket node X-Git-Tag: v0.7.0~43^2~15 X-Git-Url: http://git.liburcu.org/?p=urcu.git;a=commitdiff_plain;h=2e2ce1e92f12b73b6b3c834c59b29e224682a68c simplify the deletion for bucket node Signed-off-by: Lai Jiangshan Signed-off-by: Mathieu Desnoyers --- diff --git a/rculfhash.c b/rculfhash.c index 91958dd..e565aec 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -1124,12 +1124,15 @@ void remove_table_partition(struct cds_lfht *ht, unsigned long i, assert(i > MIN_TABLE_ORDER); ht->flavor->read_lock(); for (j = size + start; j < size + start + len; j++) { - struct cds_lfht_node *fini_node = bucket_at(ht, j); + struct cds_lfht_node *fini_bucket = bucket_at(ht, j); + struct cds_lfht_node *parent_bucket = bucket_at(ht, j - size); assert(j >= size && j < (size << 1)); dbg_printf("remove entry: order %lu index %lu hash %lu\n", i, j, j); - (void) _cds_lfht_del(ht, size, fini_node, 1); + /* Set the REMOVED_FLAG to freeze the ->next for gc */ + uatomic_or(&fini_bucket->next, REMOVED_FLAG); + _cds_lfht_gc_bucket(parent_bucket, fini_bucket); } ht->flavor->read_unlock(); }