From 255e547e18e127ab70ffa2e423f7753786cb424e Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 25 Apr 2023 22:21:19 +0800 Subject: [PATCH 1/3] fix(timer): allow timer_info() to get info about current timer --- src/nvim/eval.c | 2 +- src/nvim/eval/funcs.c | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/nvim/eval.c b/src/nvim/eval.c index bc33697c62..b3618c1811 100644 --- a/src/nvim/eval.c +++ b/src/nvim/eval.c @@ -6002,7 +6002,7 @@ void add_timer_info_all(typval_T *rettv) tv_list_alloc_ret(rettv, map_size(&timers)); timer_T *timer; map_foreach_value(&timers, timer, { - if (!timer->stopped) { + if (!timer->stopped || timer->refcount > 1) { add_timer_info(rettv, timer); } }) diff --git a/src/nvim/eval/funcs.c b/src/nvim/eval/funcs.c index 72e25411ff..3cf18e1c68 100644 --- a/src/nvim/eval/funcs.c +++ b/src/nvim/eval/funcs.c @@ -8944,7 +8944,7 @@ static void f_timer_info(typval_T *argvars, typval_T *rettv, EvalFuncData fptr) } tv_list_alloc_ret(rettv, 1); timer_T *timer = find_timer_by_nr(tv_get_number(&argvars[0])); - if (timer != NULL && !timer->stopped) { + if (timer != NULL && (!timer->stopped || timer->refcount > 1)) { add_timer_info(rettv, timer); } } else { From cc6845db94ce1964c9fa15f451f33f7eb7bfb8df Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 25 Apr 2023 21:52:27 +0800 Subject: [PATCH 2/3] vim-patch:8.2.3768: timer_info() has the wrong repeat value in a timer callback Problem: timer_info() has the wrong repeat value in a timer callback. Solution: Do not add one to the repeat value when in the callback. (closes vim/vim#9294) https://github.com/vim/vim/commit/95b2dd0c008f0977ebb3cbe233a5064001a332e1 Co-authored-by: Bram Moolenaar --- test/old/testdir/test_timers.vim | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/test/old/testdir/test_timers.vim b/test/old/testdir/test_timers.vim index aa766fff40..ca9a312f95 100644 --- a/test/old/testdir/test_timers.vim +++ b/test/old/testdir/test_timers.vim @@ -94,6 +94,13 @@ func Test_timer_info() call assert_equal([], timer_info(id)) call assert_fails('call timer_info("abc")', 'E39:') + + " check repeat count inside the callback + let g:timer_repeat = [] + let tid = timer_start(10, {tid -> execute("call add(g:timer_repeat, timer_info(tid)[0].repeat)")}, #{repeat: 3}) + sleep 100m + call assert_equal([2, 1, 0], g:timer_repeat) + unlet g:timer_repeat endfunc func Test_timer_stopall() From 1dd9cd29652dd3ab5e960eb94bc9f7f48ff97670 Mon Sep 17 00:00:00 2001 From: zeertzjq Date: Tue, 25 Apr 2023 22:03:52 +0800 Subject: [PATCH 3/3] vim-patch:8.2.3772: timer info test fails on slow machine Problem: Timer info test fails on slow machine. Solution: Use WaitForAssert(). https://github.com/vim/vim/commit/ff39a650b2bd31e30d1bb8766e8560f9a14a7137 Co-authored-by: Bram Moolenaar --- test/old/testdir/test_timers.vim | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/test/old/testdir/test_timers.vim b/test/old/testdir/test_timers.vim index ca9a312f95..b5781748bc 100644 --- a/test/old/testdir/test_timers.vim +++ b/test/old/testdir/test_timers.vim @@ -98,8 +98,7 @@ func Test_timer_info() " check repeat count inside the callback let g:timer_repeat = [] let tid = timer_start(10, {tid -> execute("call add(g:timer_repeat, timer_info(tid)[0].repeat)")}, #{repeat: 3}) - sleep 100m - call assert_equal([2, 1, 0], g:timer_repeat) + call WaitForAssert({-> assert_equal([2, 1, 0], g:timer_repeat)}) unlet g:timer_repeat endfunc