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