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

Reply via email to