aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorJustin M. Keyes <justinkz@gmail.com>2019-09-11 12:56:46 -0700
committerGitHub <noreply@github.com>2019-09-11 12:56:46 -0700
commit7652904f79f6e434568e0b8e5946cfcafc9aa767 (patch)
tree3c5f0f83308102190ed9e3209900b222d17ed808 /src
parentc8223e1618c4510f9eff13df509c6da95f869cc6 (diff)
downloadrneovim-7652904f79f6e434568e0b8e5946cfcafc9aa767.tar.gz
rneovim-7652904f79f6e434568e0b8e5946cfcafc9aa767.tar.bz2
rneovim-7652904f79f6e434568e0b8e5946cfcafc9aa767.zip
eval: wait(): always spin up dummy-timer #10990
This avoids getting "stuck". If user actually _wants_ to get stuck forever, they could use `:sleep` or specify a really big `interval`.
Diffstat (limited to 'src')
-rw-r--r--src/nvim/eval.c41
1 files changed, 16 insertions, 25 deletions
diff --git a/src/nvim/eval.c b/src/nvim/eval.c
index b067e03c2f..f9d346ea68 100644
--- a/src/nvim/eval.c
+++ b/src/nvim/eval.c
@@ -10910,31 +10910,24 @@ static void f_wait(typval_T *argvars, typval_T *rettv, FunPtr fptr)
EMSG2(_(e_invargval), "1");
return;
}
+ if ((argvars[2].v_type != VAR_NUMBER && argvars[2].v_type != VAR_UNKNOWN)
+ || (argvars[2].v_type == VAR_NUMBER && argvars[2].vval.v_number <= 0)) {
+ EMSG2(_(e_invargval), "3");
+ return;
+ }
int timeout = argvars[0].vval.v_number;
typval_T expr = argvars[1];
+ int interval = argvars[2].v_type == VAR_NUMBER
+ ? argvars[2].vval.v_number
+ : 200; // Default.
+ TimeWatcher *tw = xmalloc(sizeof(TimeWatcher));
- int interval = -1;
- typval_T *tv_interval = &argvars[2];
-
- TimeWatcher *tw = NULL;
-
- if (tv_interval->v_type == VAR_NUMBER) {
- interval = tv_interval->vval.v_number;
- if (interval <= 0) {
- EMSG2(_(e_invargval), "3");
- return;
- }
- // Start dummy timer
- tw = xmalloc(sizeof(TimeWatcher));
- time_watcher_init(&main_loop, tw, NULL);
- tw->events = main_loop.events;
- tw->blockable = true;
- time_watcher_start(tw, dummy_timer_due_cb, interval, interval);
- } else if (tv_interval->v_type != VAR_UNKNOWN) {
- EMSG2(_(e_invargval), "3");
- return;
- }
+ // Start dummy timer.
+ time_watcher_init(&main_loop, tw, NULL);
+ tw->events = main_loop.events;
+ tw->blockable = true;
+ time_watcher_start(tw, dummy_timer_due_cb, interval, interval);
typval_T argv = TV_INITIAL_VALUE;
typval_T exprval = TV_INITIAL_VALUE;
@@ -10960,10 +10953,8 @@ static void f_wait(typval_T *argvars, typval_T *rettv, FunPtr fptr)
called_emsg = save_called_emsg;
// Stop dummy timer
- if (tw) {
- time_watcher_stop(tw);
- time_watcher_close(tw, dummy_timer_close_cb);
- }
+ time_watcher_stop(tw);
+ time_watcher_close(tw, dummy_timer_close_cb);
}
// "win_screenpos()" function