diff options
author | Yegappan Lakshmanan <yegappan@yahoo.com> | 2022-10-16 11:30:48 +0100 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2022-10-16 11:30:48 +0100 |
commit | d8cd6f7427bc89aa38f42cc44f58bf5fb5f0f972 (patch) | |
tree | 96c67b433df5321a288a133f89e3998a2bf92977 | |
parent | db4c94788ad70118fa1ccc5fbc821757350ac771 (diff) | |
download | vim-git-9.0.0770.tar.gz |
patch 9.0.0770: quickfix commands may keep memory allocatedv9.0.0770
Problem: Quickfix commands may keep memory allocated.
Solution: Free memory when it's a bit much. (Yegappan Lakshmanan,
closes #11379)
-rw-r--r-- | src/quickfix.c | 23 | ||||
-rw-r--r-- | src/version.c | 2 |
2 files changed, 24 insertions, 1 deletions
diff --git a/src/quickfix.c b/src/quickfix.c index 5895e8923..a90611475 100644 --- a/src/quickfix.c +++ b/src/quickfix.c @@ -236,13 +236,29 @@ qfga_get(void) ga_init2(&qfga, 1, 256); } - // Retain ga_data from previous use. Reset the length to zero. + // Reset the length to zero. Retain ga_data from previous use to avoid + // many alloc/free calls. qfga.ga_len = 0; return &qfga; } /* + * The "qfga" grow array buffer is reused across multiple quickfix commands as + * a temporary buffer to reduce the number of alloc/free calls. But if the + * buffer size is large, then to avoid holding on to that memory, clear the + * grow array. Otherwise just reset the grow array length. + */ + static void +qfga_clear(void) +{ + if (qfga.ga_maxlen > 1000) + ga_clear(&qfga); + else + qfga.ga_len = 0; +} + +/* * Maximum number of bytes allowed per line while reading a errorfile. */ #define LINE_MAXLEN 4096 @@ -3335,6 +3351,8 @@ qf_jump_print_msg( msg_scroll = FALSE; msg_attr_keep((char *)gap->ga_data, 0, TRUE); msg_scroll = i; + + qfga_clear(); } /* @@ -3744,6 +3762,7 @@ qf_list(exarg_T *eap) ui_breakcheck(); } + qfga_clear(); } /* @@ -4820,6 +4839,8 @@ qf_fill_buffer(qf_list_T *qfl, buf_T *buf, qfline_T *old_last, int qf_winid) if (old_last == NULL) // Delete the empty line which is now at the end (void)ml_delete(lnum + 1); + + qfga_clear(); } // correct cursor position diff --git a/src/version.c b/src/version.c index 73b397caa..e9cacd59c 100644 --- a/src/version.c +++ b/src/version.c @@ -696,6 +696,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 770, +/**/ 769, /**/ 768, |