Mercurial > vim
diff src/autocmd.c @ 31267:4bc9cd62d378 v9.0.0967
patch 9.0.0967: leaking memory from autocmd windows
Commit: https://github.com/vim/vim/commit/84497cd06f06516f6ce727ea00c47792ce16dc70
Author: Bram Moolenaar <Bram@vim.org>
Date: Mon Nov 28 20:34:52 2022 +0000
patch 9.0.0967: leaking memory from autocmd windows
Problem: Leaking memory from autocmd windows.
Solution: Free window when auc_win is not NULL.
author | Bram Moolenaar <Bram@vim.org> |
---|---|
date | Mon, 28 Nov 2022 21:45:03 +0100 |
parents | d8e7d725a666 |
children | 742b7bf2fefc |
line wrap: on
line diff
--- a/src/autocmd.c +++ b/src/autocmd.c @@ -653,12 +653,7 @@ free_all_autocmds(void) } ga_clear(&augroups); - for (int i = 0; i < AUCMD_WIN_COUNT; ++i) - if (aucmd_win[i].auc_win_used) - { - aucmd_win[i].auc_win_used = FALSE; - win_remove(aucmd_win[i].auc_win, NULL); - } + // aucmd_win[] is freed in win_free_all() } #endif @@ -1553,12 +1548,11 @@ aucmd_prepbuf( for (auc_idx = 0; auc_idx < AUCMD_WIN_COUNT; ++auc_idx) if (!aucmd_win[auc_idx].auc_win_used) { - auc_win = win_alloc_popup_win(); + if (aucmd_win[auc_idx].auc_win == NULL) + aucmd_win[auc_idx].auc_win = win_alloc_popup_win(); + auc_win = aucmd_win[auc_idx].auc_win; if (auc_win != NULL) - { - aucmd_win[auc_idx].auc_win = auc_win; aucmd_win[auc_idx].auc_win_used = TRUE; - } break; } @@ -1667,6 +1661,9 @@ win_found: // Remove the window and frame from the tree of frames. (void)winframe_remove(curwin, &dummy, NULL); win_remove(curwin, NULL); + + // The window is marked as not used, but it is not freed, it can be + // used again. aucmd_win[aco->use_aucmd_win_idx].auc_win_used = FALSE; last_status(FALSE); // may need to remove last status line