From 6cd1a12e503122b461c51d5d5772f174651bab8c Mon Sep 17 00:00:00 2001 From: Ivica Ico Bukvic <ico@vt.edu> Date: Wed, 27 Feb 2013 23:28:31 -0500 Subject: [PATCH] improved logic for freeing rtext that alleviates memory leak but also does not crash abstractions and gop objects (there are still memory leaks apparent in l2ork_output~ external which may be linked to individual objects having incomplete free functions). See http://sourceforge.net/tracker/?func=detail&aid=3605235&group_id=55736&atid=478070 for more info --- pd/src/g_graph.c | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) diff --git a/pd/src/g_graph.c b/pd/src/g_graph.c index a2162894e..760113de3 100644 --- a/pd/src/g_graph.c +++ b/pd/src/g_graph.c @@ -91,6 +91,8 @@ void glist_delete(t_glist *x, t_gobj *y) t_canvas *canvas = glist_getcanvas(x); int drawcommand = class_isdrawcommand(y->g_pd); int wasdeleting; + t_rtext *rt = NULL; + int late_rtext_free = 0; if (pd_class(&y->g_pd) == canvas_class) { /* JMZ: send a closebang to the canvas */ @@ -136,11 +138,24 @@ void glist_delete(t_glist *x, t_gobj *y) glist_getcanvas(x)->gl_name)), 2); if (glist_isvisible(canvas)) gobj_vis(y, x, 0); - if (x->gl_editor && (ob = pd_checkobject(&y->g_pd))) + if (x->gl_editor && (ob = pd_checkobject(&y->g_pd))) { //rtext_new(x, ob); - rtext_free(glist_findrtext(x, ob)); + rt = glist_findrtext(x, ob); + if (rt) { + if (pd_class(&y->g_pd) != canvas_class) { + //fprintf(stderr,"glist_delete calls rtext_free %lx %d %d %d\n", + //glist_findrtext(x, ob), + //(pd_class(&y->g_pd) != canvas_class ? 1 : 0), + //(!x->gl_isgraph ? 1 : 0), + //(!x->gl_owner ? 1 : 0)); + rtext_free(rt); + } else { + late_rtext_free = 1; + } + } + } if (x->gl_list == y) { - if (y->g_next) + if (y->g_next) x->gl_list = y->g_next; else x->gl_list = NULL; @@ -163,6 +178,10 @@ void glist_delete(t_glist *x, t_gobj *y) glist_getcanvas(x)->gl_name)), 1); canvas_setdeleting(canvas, wasdeleting); x->gl_valid = ++glist_valid; + if (late_rtext_free) { + fprintf(stderr,"glist_delete late_rtext_free\n"); + rtext_free(rt); + } } } -- GitLab