From 107e1eef1df3b786ad3ad49fbdb9e058649303b5 Mon Sep 17 00:00:00 2001 From: Bram Moolenaar Date: Fri, 8 Apr 2016 17:07:19 +0200 Subject: patch 7.4.1719 Problem: Leaking memory when there is a cycle involving a job and a partial. Solution: Add a copyID to job and channel. Set references in items referred by them. Go through all jobs and channels to find unreferenced items. Also, decrement reference counts when garbage collecting. --- src/proto/eval.pro | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) (limited to 'src/proto/eval.pro') diff --git a/src/proto/eval.pro b/src/proto/eval.pro index 1de7a6d9dc..38392b9bd2 100644 --- a/src/proto/eval.pro +++ b/src/proto/eval.pro @@ -45,10 +45,12 @@ void ex_lockvar(exarg_T *eap); int do_unlet(char_u *name, int forceit); void del_menutrans_vars(void); char_u *get_user_var_name(expand_T *xp, int idx); +void partial_unref(partial_T *pt); list_T *list_alloc(void); int rettv_list_alloc(typval_T *rettv); void list_unref(list_T *l); -void list_free(list_T *l, int recurse); +void list_free_internal(list_T *l); +void list_free(list_T *l); listitem_T *listitem_alloc(void); void listitem_free(listitem_T *item); void listitem_remove(list_T *l, listitem_T *item); @@ -71,7 +73,8 @@ int set_ref_in_item(typval_T *tv, int copyID, ht_stack_T **ht_stack, list_stack_ dict_T *dict_alloc(void); int rettv_dict_alloc(typval_T *rettv); void dict_unref(dict_T *d); -void dict_free(dict_T *d, int recurse); +void dict_free_internal(dict_T *d); +void dict_free(dict_T *d); dictitem_T *dictitem_alloc(char_u *key); void dictitem_free(dictitem_T *item); int dict_add(dict_T *d, dictitem_T *item); @@ -87,7 +90,6 @@ int call_func(char_u *funcname, int len, typval_T *rettv, int argcount_in, typva buf_T *buflist_find_by_name(char_u *name, int curtab_only); int func_call(char_u *name, typval_T *args, partial_T *partial, dict_T *selfdict, typval_T *rettv); void dict_extend(dict_T *d1, dict_T *d2, char_u *action); -void partial_unref(partial_T *pt); void mzscheme_call_vim(char_u *name, typval_T *args, typval_T *rettv); float_T vim_round(float_T f); long do_searchpair(char_u *spat, char_u *mpat, char_u *epat, int dir, char_u *skip, int flags, pos_T *match_pos, linenr_T lnum_stop, long time_limit); -- cgit v1.2.3