]> git.ipfire.org Git - thirdparty/vim.git/commitdiff
patch 9.0.0770: quickfix commands may keep memory allocated v9.0.0770
authorYegappan Lakshmanan <yegappan@yahoo.com>
Sun, 16 Oct 2022 10:30:48 +0000 (11:30 +0100)
committerBram Moolenaar <Bram@vim.org>
Sun, 16 Oct 2022 10:30:48 +0000 (11:30 +0100)
Problem:    Quickfix commands may keep memory allocated.
Solution:   Free memory when it's a bit much. (Yegappan Lakshmanan,
            closes #11379)

src/quickfix.c
src/version.c

index 5895e89239c6d38bb425ef02b6f949eeed812bce..a90611475ab1c70426f9049259d0515ac680c6e5 100644 (file)
@@ -236,12 +236,28 @@ 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.
  */
@@ -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
index 73b397caa4777f9780c570deb7f035314bae5f2d..e9cacd59c1e619dbf6d85a5ed33d581884dfe699 100644 (file)
@@ -695,6 +695,8 @@ static char *(features[]) =
 
 static int included_patches[] =
 {   /* Add new patch number below this line */
+/**/
+    770,
 /**/
     769,
 /**/