mirror of
https://github.com/neovim/neovim.git
synced 2025-09-24 20:18:32 +00:00
fix(jobs): do not block UI when jobwait() doesn't block (#31803)
This commit is contained in:
@@ -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;
|
||||
|
Reference in New Issue
Block a user