1
0
forked from aniani/vim

patch 8.1.1641: garbage collection may run at a wrong moment

Problem:    Garbage collection may run at a wrong moment. (Trygve Aaberge)
Solution:   Postpone garbage collection while parsing messages. (closes #4620)
This commit is contained in:
Bram Moolenaar
2019-07-07 14:05:24 +02:00
parent c2f5054be9
commit 6cc7e21412
2 changed files with 11 additions and 0 deletions

View File

@@ -4444,12 +4444,19 @@ parse_queued_messages(void)
{ {
win_T *old_curwin = curwin; win_T *old_curwin = curwin;
int i; int i;
int save_may_garbage_collect = may_garbage_collect;
// Do not handle messages while redrawing, because it may cause buffers to // Do not handle messages while redrawing, because it may cause buffers to
// change or be wiped while they are being redrawn. // change or be wiped while they are being redrawn.
if (updating_screen) if (updating_screen)
return; return;
// may_garbage_collect is set in main_loop() to do garbage collection when
// blocking to wait on a character. We don't want that while parsing
// messages, a callback may invoke vgetc() while lists and dicts are in use
// in the call stack.
may_garbage_collect = FALSE;
// Loop when a job ended, but don't keep looping forever. // Loop when a job ended, but don't keep looping forever.
for (i = 0; i < MAX_REPEAT_PARSE; ++i) for (i = 0; i < MAX_REPEAT_PARSE; ++i)
{ {
@@ -4485,6 +4492,8 @@ parse_queued_messages(void)
break; break;
} }
may_garbage_collect = save_may_garbage_collect;
// If the current window changed we need to bail out of the waiting loop. // If the current window changed we need to bail out of the waiting loop.
// E.g. when a job exit callback closes the terminal window. // E.g. when a job exit callback closes the terminal window.
if (curwin != old_curwin) if (curwin != old_curwin)

View File

@@ -777,6 +777,8 @@ static char *(features[]) =
static int included_patches[] = static int included_patches[] =
{ /* Add new patch number below this line */ { /* Add new patch number below this line */
/**/
1641,
/**/ /**/
1640, 1640,
/**/ /**/