From efe1732c6fd802ca8fdccc1f0a26be87427f1e70 Mon Sep 17 00:00:00 2001 From: Gregory Anders Date: Wed, 1 Jan 2025 18:43:16 -0600 Subject: fix(jobs): do not block UI when jobwait() doesn't block (#31803) --- src/nvim/eval/funcs.c | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) (limited to 'src') diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index a0c18a4c95..fbaa6e679f 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -4177,8 +4177,6 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) return; } - ui_busy_start(); - ui_flush(); list_T *args = argvars[0].vval.v_list; Channel **jobs = xcalloc((size_t)tv_list_len(args), sizeof(*jobs)); MultiQueue *waiting_jobs = multiqueue_new_parent(loop_on_put, &main_loop); @@ -4215,6 +4213,13 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) before = os_hrtime(); } + // Only mark the UI as busy when jobwait() blocks + const bool busy = remaining != 0; + if (busy) { + ui_busy_start(); + ui_flush(); + } + for (i = 0; i < tv_list_len(args); i++) { if (remaining == 0) { break; // Timeout. @@ -4256,7 +4261,9 @@ static void f_jobwait(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) multiqueue_free(waiting_jobs); xfree(jobs); - ui_busy_stop(); + if (busy) { + ui_busy_stop(); + } tv_list_ref(rv); rettv->v_type = VAR_LIST; rettv->vval.v_list = rv; -- cgit