From 7652904f79f6e434568e0b8e5946cfcafc9aa767 Mon Sep 17 00:00:00 2001 From: "Justin M. Keyes" Date: Wed, 11 Sep 2019 12:56:46 -0700 Subject: 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`. --- src/nvim/eval.c | 41 ++++++++++++++++------------------------- 1 file changed, 16 insertions(+), 25 deletions(-) (limited to 'src') 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 -- cgit