We can aggressively grow a ht, but we should conservatively shrink a ht. When we try to shrink the ht after a deletion, but if a growing is required after it, we should stop this shrink.
But it is more complicated to implement it, so we use more conservative strategy to shrink a ht to gain simple code: We stop to (lazy) shrink when we found growing is in progress. Signed-off-by: Lai Jiangshan <[email protected]> --- rculfhash.c | 29 ++++++++++++++++++++++++++++- 1 files changed, 28 insertions(+), 1 deletions(-) diff --git a/rculfhash.c b/rculfhash.c index c12ee10..5ff832d 100644 --- a/rculfhash.c +++ b/rculfhash.c @@ -1797,6 +1797,33 @@ void cds_lfht_resize_lazy_count(struct cds_lfht *ht, unsigned long size, if (!(ht->flags & CDS_LFHT_AUTO_RESIZE)) return; - resize_target_update_count(ht, count); + count = max(count, ht->min_alloc_size); + if (count == size) + return; + + if (count > size) { /* lazy grow */ + if (resize_target_grow(ht, count) >= count) + return; + } else { /* lazy shrink */ + for (;;) { + unsigned long s; + + s = uatomic_cmpxchg(&ht->t.resize_target, size, count); + + if (s == size) + break; + + /* growing is/(was just) in progress */ + if (s > size) + return; + + /* some other thread do shrink for me*/ + if (s <= count) + return; + + size = s; + } + } + __cds_lfht_resize_lazy_launch(ht); } -- 1.7.4.4 _______________________________________________ ltt-dev mailing list [email protected] http://lists.casi.polymtl.ca/cgi-bin/mailman/listinfo/ltt-dev
