mirror of
https://github.com/neovim/neovim.git
synced 2025-09-17 00:38:17 +00:00
timers: make timers work with zero timeout
This commit is contained in:
@@ -435,6 +435,7 @@ typedef struct {
|
||||
TimeWatcher tw;
|
||||
int timer_id;
|
||||
int repeat_count;
|
||||
long timeout;
|
||||
bool stopped;
|
||||
ufunc_T *callback;
|
||||
} timer_T;
|
||||
@@ -16655,6 +16656,7 @@ static void f_timer_start(typval_T *argvars, typval_T *rettv)
|
||||
timer = xmalloc(sizeof *timer);
|
||||
timer->stopped = false;
|
||||
timer->repeat_count = repeat;
|
||||
timer->timeout = timeout;
|
||||
timer->timer_id = last_timer_id++;
|
||||
timer->callback = func;
|
||||
|
||||
@@ -16709,6 +16711,14 @@ static void timer_due_cb(TimeWatcher *tw, void *data)
|
||||
call_user_func(timer->callback, ARRAY_SIZE(argv), argv, &rettv,
|
||||
curwin->w_cursor.lnum, curwin->w_cursor.lnum, NULL);
|
||||
clear_tv(&rettv);
|
||||
|
||||
if (!timer->stopped && timer->timeout == 0) {
|
||||
// special case: timeout=0 means the callback will be
|
||||
// invoked again on the next event loop tick.
|
||||
// we don't use uv_idle_t to not spin the event loop
|
||||
// when the main loop is blocked.
|
||||
time_watcher_start(&timer->tw, timer_due_cb, 0, 0);
|
||||
}
|
||||
}
|
||||
|
||||
static void timer_stop(timer_T *timer)
|
||||
|
Reference in New Issue
Block a user