mirror of
https://github.com/vim/vim.git
synced 2025-07-26 11:04:33 -04:00
patch 8.2.3640: freeze when calling term_wait() in a close callback
Problem: Freeze when calling term_wait() in a close callback. Solution: Set a "closing" flag to tell term_wait() to return. (closes #9152)
This commit is contained in:
parent
7f0c4b418e
commit
eea32afdb8
@ -3156,6 +3156,10 @@ channel_close(channel_T *channel, int invoke_close_cb)
|
|||||||
{
|
{
|
||||||
ch_part_T part;
|
ch_part_T part;
|
||||||
|
|
||||||
|
#ifdef FEAT_TERMINAL
|
||||||
|
// let the terminal know it is closing to avoid getting stuck
|
||||||
|
term_channel_closing(channel);
|
||||||
|
#endif
|
||||||
// Invoke callbacks and flush buffers before the close callback.
|
// Invoke callbacks and flush buffers before the close callback.
|
||||||
if (channel->ch_close_cb.cb_name != NULL)
|
if (channel->ch_close_cb.cb_name != NULL)
|
||||||
ch_log(channel,
|
ch_log(channel,
|
||||||
|
@ -20,6 +20,7 @@ int term_use_loop(void);
|
|||||||
void term_win_entered(void);
|
void term_win_entered(void);
|
||||||
int terminal_loop(int blocking);
|
int terminal_loop(int blocking);
|
||||||
int may_close_term_popup(void);
|
int may_close_term_popup(void);
|
||||||
|
void term_channel_closing(channel_T *ch);
|
||||||
void term_channel_closed(channel_T *ch);
|
void term_channel_closed(channel_T *ch);
|
||||||
void term_check_channel_closed_recently(void);
|
void term_check_channel_closed_recently(void);
|
||||||
int term_do_update_window(win_T *wp);
|
int term_do_update_window(win_T *wp);
|
||||||
|
@ -99,6 +99,7 @@ struct terminal_S {
|
|||||||
int tl_vterm_size_changed;
|
int tl_vterm_size_changed;
|
||||||
|
|
||||||
int tl_normal_mode; // TRUE: Terminal-Normal mode
|
int tl_normal_mode; // TRUE: Terminal-Normal mode
|
||||||
|
int tl_channel_closing;
|
||||||
int tl_channel_closed;
|
int tl_channel_closed;
|
||||||
int tl_channel_recently_closed; // still need to handle tl_finish
|
int tl_channel_recently_closed; // still need to handle tl_finish
|
||||||
|
|
||||||
@ -3458,6 +3459,20 @@ may_close_term_popup(void)
|
|||||||
}
|
}
|
||||||
#endif
|
#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.
|
* Called when a channel has been closed.
|
||||||
* If this was a channel for a terminal window then finish it up.
|
* 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
|
// If the terminal is closed when the channel is closed the
|
||||||
// buffer disappears.
|
// buffer disappears.
|
||||||
break;
|
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();
|
term_flush_messages();
|
||||||
|
@ -2058,5 +2058,22 @@ func Test_terminal_adds_jump()
|
|||||||
bwipe!
|
bwipe!
|
||||||
endfunc
|
endfunc
|
||||||
|
|
||||||
|
func Close_cb(ch, ctx)
|
||||||
|
call term_wait(a:ctx.bufnr)
|
||||||
|
let g:close_done = 'done'
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
func Test_term_wait_in_close_cb()
|
||||||
|
let g:close_done = ''
|
||||||
|
let ctx = {}
|
||||||
|
let ctx.bufnr = term_start('echo "HELLO WORLD"',
|
||||||
|
\ {'close_cb': {ch -> Close_cb(ch, ctx)}})
|
||||||
|
|
||||||
|
call WaitForAssert({-> assert_equal("done", g:close_done)})
|
||||||
|
|
||||||
|
unlet g:close_done
|
||||||
|
bwipe!
|
||||||
|
endfunc
|
||||||
|
|
||||||
|
|
||||||
" vim: shiftwidth=2 sts=2 expandtab
|
" vim: shiftwidth=2 sts=2 expandtab
|
||||||
|
@ -757,6 +757,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 */
|
||||||
|
/**/
|
||||||
|
3640,
|
||||||
/**/
|
/**/
|
||||||
3639,
|
3639,
|
||||||
/**/
|
/**/
|
||||||
|
Loading…
x
Reference in New Issue
Block a user