diff options
author | Gregory Anders <greg@gpanders.com> | 2025-01-01 18:43:16 -0600 |
---|---|---|
committer | GitHub <noreply@github.com> | 2025-01-01 18:43:16 -0600 |
commit | efe1732c6fd802ca8fdccc1f0a26be87427f1e70 (patch) | |
tree | 470313a5c2e9dc968edbd43ce7fd890198c0d5ec | |
parent | 6dc0eb9f41e6453fe003dd3a28c58b701fd003c9 (diff) | |
download | rneovim-efe1732c6fd802ca8fdccc1f0a26be87427f1e70.tar.gz rneovim-efe1732c6fd802ca8fdccc1f0a26be87427f1e70.tar.bz2 rneovim-efe1732c6fd802ca8fdccc1f0a26be87427f1e70.zip |
fix(jobs): do not block UI when jobwait() doesn't block (#31803)
-rw-r--r-- | src/nvim/eval/funcs.c | 13 | ||||
-rw-r--r-- | test/functional/core/job_spec.lua | 33 |
2 files changed, 43 insertions, 3 deletions
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; diff --git a/test/functional/core/job_spec.lua b/test/functional/core/job_spec.lua index 952437d80e..e833b5127d 100644 --- a/test/functional/core/job_spec.lua +++ b/test/functional/core/job_spec.lua @@ -973,6 +973,39 @@ describe('jobs', function() feed('<CR>') fn.jobstop(api.nvim_get_var('id')) end) + + it('does not set UI busy with zero timeout #31712', function() + local screen = Screen.new(50, 6) + command([[let g:id = jobstart(['sleep', '0.3'])]]) + local busy = 0 + screen._handle_busy_start = (function(orig) + return function() + orig(screen) + busy = busy + 1 + end + end)(screen._handle_busy_start) + source([[ + func PrintAndPoll() + echon "aaa\nbbb" + call jobwait([g:id], 0) + echon "\nccc" + endfunc + ]]) + feed_command('call PrintAndPoll()') + screen:expect { + grid = [[ + | + {3: }| + aaa | + bbb | + ccc | + {6:Press ENTER or type command to continue}^ | + ]], + } + feed('<CR>') + fn.jobstop(api.nvim_get_var('id')) + eq(0, busy) + end) end) pending('exit event follows stdout, stderr', function() |