diff options
author | Bram Moolenaar <Bram@vim.org> | 2021-11-21 14:51:13 +0000 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2021-11-21 14:51:13 +0000 |
commit | eea32afdb83ae281a63152f7494f79ec7e45ff55 (patch) | |
tree | 78938a8c7f2d263f1d66a3c6293ea4c9af8ef3a0 /src/terminal.c | |
parent | 7f0c4b418e01d6e056a74de2f22fcbad613b7591 (diff) | |
download | vim-git-eea32afdb83ae281a63152f7494f79ec7e45ff55.tar.gz |
patch 8.2.3640: freeze when calling term_wait() in a close callbackv8.2.3640
Problem: Freeze when calling term_wait() in a close callback.
Solution: Set a "closing" flag to tell term_wait() to return. (closes #9152)
Diffstat (limited to 'src/terminal.c')
-rw-r--r-- | src/terminal.c | 18 |
1 files changed, 18 insertions, 0 deletions
diff --git a/src/terminal.c b/src/terminal.c index 24779d9c2..f6c283b63 100644 --- a/src/terminal.c +++ b/src/terminal.c @@ -99,6 +99,7 @@ struct terminal_S { int tl_vterm_size_changed; int tl_normal_mode; // TRUE: Terminal-Normal mode + int tl_channel_closing; int tl_channel_closed; int tl_channel_recently_closed; // still need to handle tl_finish @@ -3459,6 +3460,20 @@ may_close_term_popup(void) #endif /* + * Called when a channel is going to be closed, before invoking the close + * callback. + */ + void +term_channel_closing(channel_T *ch) +{ + term_T *term; + + for (term = first_term; term != NULL; term = term->tl_next) + if (term->tl_job == ch->ch_job && !term->tl_channel_closed) + term->tl_channel_closing = TRUE; +} + +/* * Called when a channel has been closed. * If this was a channel for a terminal window then finish it up. */ @@ -6438,6 +6453,9 @@ f_term_wait(typval_T *argvars, typval_T *rettv UNUSED) // If the terminal is closed when the channel is closed the // buffer disappears. break; + if (buf->b_term == NULL || buf->b_term->tl_channel_closing) + // came here from a close callback, only wait one time + break; } term_flush_messages(); |