diff options
author | Bram Moolenaar <Bram@vim.org> | 2016-08-06 22:05:07 +0200 |
---|---|---|
committer | Bram Moolenaar <Bram@vim.org> | 2016-08-06 22:05:07 +0200 |
commit | 8e97bd74b5377753597e3d98e7123d8985c7fffd (patch) | |
tree | 25d909a542f5a015aa92d00512e46f1fb72f1ab4 /src | |
parent | 446cce6d537b036467033975a86729dbdc83f860 (diff) |
patch 7.4.2170v7.4.2170
Problem: Cannot get information about timers.
Solution: Add timer_info().
Diffstat (limited to 'src')
-rw-r--r-- | src/evalfunc.c | 27 | ||||
-rw-r--r-- | src/ex_cmds2.c | 62 | ||||
-rw-r--r-- | src/proto/ex_cmds2.pro | 2 | ||||
-rw-r--r-- | src/version.c | 2 |
4 files changed, 90 insertions, 3 deletions
diff --git a/src/evalfunc.c b/src/evalfunc.c index 3754534460..50fa3bf720 100644 --- a/src/evalfunc.c +++ b/src/evalfunc.c @@ -396,6 +396,7 @@ static void f_tan(typval_T *argvars, typval_T *rettv); static void f_tanh(typval_T *argvars, typval_T *rettv); #endif #ifdef FEAT_TIMERS +static void f_timer_info(typval_T *argvars, typval_T *rettv); static void f_timer_start(typval_T *argvars, typval_T *rettv); static void f_timer_stop(typval_T *argvars, typval_T *rettv); #endif @@ -815,6 +816,7 @@ static struct fst {"test_null_string", 0, 0, f_test_null_string}, {"test_settime", 1, 1, f_test_settime}, #ifdef FEAT_TIMERS + {"timer_info", 0, 1, f_timer_info}, {"timer_start", 2, 3, f_timer_start}, {"timer_stop", 1, 1, f_timer_stop}, #endif @@ -11961,6 +11963,31 @@ free_callback(char_u *callback, partial_T *partial) #ifdef FEAT_TIMERS /* + * "timer_info([timer])" function + */ + static void +f_timer_info(typval_T *argvars, typval_T *rettv) +{ + timer_T *timer = NULL; + + if (rettv_list_alloc(rettv) != OK) + return; + if (argvars[0].v_type != VAR_UNKNOWN) + { + if (argvars[0].v_type != VAR_NUMBER) + EMSG(_(e_number_exp)); + else + { + timer = find_timer((int)get_tv_number(&argvars[0])); + if (timer != NULL) + add_timer_info(rettv, timer); + } + } + else + add_timer_info_all(rettv); +} + +/* * "timer_start(time, callback [, options])" function */ static void diff --git a/src/ex_cmds2.c b/src/ex_cmds2.c index 0e332dd421..f6c054b8d2 100644 --- a/src/ex_cmds2.c +++ b/src/ex_cmds2.c @@ -1139,10 +1139,8 @@ create_timer(long msec, int repeat) timer->tr_id = ++last_timer_id; insert_timer(timer); if (repeat != 0) - { timer->tr_repeat = repeat - 1; - timer->tr_interval = msec; - } + timer->tr_interval = msec; profile_setlimit(msec, &timer->tr_due); return timer; @@ -1253,6 +1251,64 @@ stop_timer(timer_T *timer) free_timer(timer); } + void +add_timer_info(typval_T *rettv, timer_T *timer) +{ + list_T *list = rettv->vval.v_list; + dict_T *dict = dict_alloc(); + dictitem_T *di; + long remaining; + proftime_T now; + + if (dict == NULL) + return; + list_append_dict(list, dict); + + dict_add_nr_str(dict, "id", (long)timer->tr_id, NULL); + dict_add_nr_str(dict, "time", (long)timer->tr_interval, NULL); + + profile_start(&now); +# ifdef WIN3264 + remaining = (long)(((double)(timer->tr_due.QuadPart - now.QuadPart) + / (double)fr.QuadPart) * 1000); +# else + remaining = (timer->tr_due.tv_sec - now.tv_sec) * 1000 + + (timer->tr_due.tv_usec - now.tv_usec) / 1000; +# endif + dict_add_nr_str(dict, "remaining", (long)remaining, NULL); + + dict_add_nr_str(dict, "repeat", + (long)(timer->tr_repeat < 0 ? -1 : timer->tr_repeat + 1), NULL); + + di = dictitem_alloc((char_u *)"callback"); + if (di != NULL) + { + if (dict_add(dict, di) == FAIL) + vim_free(di); + else if (timer->tr_partial != NULL) + { + di->di_tv.v_type = VAR_PARTIAL; + di->di_tv.vval.v_partial = timer->tr_partial; + ++timer->tr_partial->pt_refcount; + } + else + { + di->di_tv.v_type = VAR_FUNC; + di->di_tv.vval.v_string = vim_strsave(timer->tr_callback); + } + di->di_tv.v_lock = 0; + } +} + + void +add_timer_info_all(typval_T *rettv) +{ + timer_T *timer; + + for (timer = first_timer; timer != NULL; timer = timer->tr_next) + add_timer_info(rettv, timer); +} + /* * Mark references in partials of timers. */ diff --git a/src/proto/ex_cmds2.pro b/src/proto/ex_cmds2.pro index c7a860b9f0..977f5c0de1 100644 --- a/src/proto/ex_cmds2.pro +++ b/src/proto/ex_cmds2.pro @@ -22,6 +22,8 @@ timer_T *create_timer(long msec, int repeat); long check_due_timer(void); timer_T *find_timer(int id); void stop_timer(timer_T *timer); +void add_timer_info(typval_T *rettv, timer_T *timer); +void add_timer_info_all(typval_T *rettv); int set_ref_in_timer(int copyID); void timer_free_all(void); void profile_divide(proftime_T *tm, int count, proftime_T *tm2); diff --git a/src/version.c b/src/version.c index e57e0fc931..b1be507afd 100644 --- a/src/version.c +++ b/src/version.c @@ -764,6 +764,8 @@ static char *(features[]) = static int included_patches[] = { /* Add new patch number below this line */ /**/ + 2170, +/**/ 2169, /**/ 2168, |