aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzeertzjq <zeertzjq@outlook.com>2022-12-27 18:58:24 +0800
committerzeertzjq <zeertzjq@outlook.com>2022-12-27 19:01:09 +0800
commit45d9735aae9aea91420c849aace76ab72e9d3f2a (patch)
tree70b67a21476b363c16428cbdc0ea9a71e5357f98
parent9bab4b72ae4c996751a83badc1c2a183c7cbf5d2 (diff)
downloadrneovim-45d9735aae9aea91420c849aace76ab72e9d3f2a.tar.gz
rneovim-45d9735aae9aea91420c849aace76ab72e9d3f2a.tar.bz2
rneovim-45d9735aae9aea91420c849aace76ab72e9d3f2a.zip
vim-patch:9.0.1100: a hashtab with many removed items is not cleaned up
Problem: A hashtab with many removed items is not cleaned up. Solution: Re-hash a hashtab even when the size didn't change if too many items were removed. https://github.com/vim/vim/commit/d0883faac6a74f777c9a6be9d035c59ee1c969c5 N/A patches for version.c: vim-patch:9.0.1099: trying to resize a hashtab may cause a problem Problem: Trying to resize a hashtab may cause a problem. Solution: Do not try to resize a hashtab before adding an item. https://github.com/vim/vim/commit/81b7ecc5cb78cad901a9a85e46ecba109cc6ee7d Co-authored-by: Bram Moolenaar <Bram@vim.org>
-rw-r--r--src/nvim/hashtab.c7
1 files changed, 4 insertions, 3 deletions
diff --git a/src/nvim/hashtab.c b/src/nvim/hashtab.c
index 55198d8e05..042cb43ce4 100644
--- a/src/nvim/hashtab.c
+++ b/src/nvim/hashtab.c
@@ -292,6 +292,7 @@ static void hash_may_resize(hashtab_T *ht, size_t minitems)
#endif // ifdef HT_DEBUG
size_t minsize;
+ const size_t oldsize = ht->ht_mask + 1;
if (minitems == 0) {
// Return quickly for small tables with at least two NULL items.
// items are required for the lookup to decide a key isn't there.
@@ -304,7 +305,6 @@ static void hash_may_resize(hashtab_T *ht, size_t minitems)
// removed items, so that they get cleaned up).
// Shrink the array when it's less than 1/5 full. When growing it is
// at least 1/4 full (avoids repeated grow-shrink operations)
- size_t oldsize = ht->ht_mask + 1;
if ((ht->ht_filled * 3 < oldsize * 2) && (ht->ht_used > oldsize / 5)) {
return;
}
@@ -336,8 +336,9 @@ static void hash_may_resize(hashtab_T *ht, size_t minitems)
bool newarray_is_small = newsize == HT_INIT_SIZE;
- if (!newarray_is_small && newsize == ht->ht_mask + 1) {
- // the hashtab is already at the desired size, bail out
+ if (!newarray_is_small && newsize == oldsize && ht->ht_filled * 3 < oldsize * 2) {
+ // The hashtab is already at the desired size, and there are not too
+ // many removed items, bail out.
return;
}