Skip to content
Snippets Groups Projects
Commit 6cd1a12e authored by Ivica Bukvic's avatar Ivica Bukvic
Browse files

improved logic for freeing rtext that alleviates memory leak but also does not...

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
parent 5bbcdc02
No related branches found
No related tags found
No related merge requests found
...@@ -91,6 +91,8 @@ void glist_delete(t_glist *x, t_gobj *y) ...@@ -91,6 +91,8 @@ void glist_delete(t_glist *x, t_gobj *y)
t_canvas *canvas = glist_getcanvas(x); t_canvas *canvas = glist_getcanvas(x);
int drawcommand = class_isdrawcommand(y->g_pd); int drawcommand = class_isdrawcommand(y->g_pd);
int wasdeleting; int wasdeleting;
t_rtext *rt = NULL;
int late_rtext_free = 0;
if (pd_class(&y->g_pd) == canvas_class) { if (pd_class(&y->g_pd) == canvas_class) {
/* JMZ: send a closebang to the canvas */ /* JMZ: send a closebang to the canvas */
...@@ -136,11 +138,24 @@ void glist_delete(t_glist *x, t_gobj *y) ...@@ -136,11 +138,24 @@ void glist_delete(t_glist *x, t_gobj *y)
glist_getcanvas(x)->gl_name)), 2); glist_getcanvas(x)->gl_name)), 2);
if (glist_isvisible(canvas)) if (glist_isvisible(canvas))
gobj_vis(y, x, 0); 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_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 (x->gl_list == y) {
if (y->g_next) if (y->g_next)
x->gl_list = y->g_next; x->gl_list = y->g_next;
else else
x->gl_list = NULL; x->gl_list = NULL;
...@@ -163,6 +178,10 @@ void glist_delete(t_glist *x, t_gobj *y) ...@@ -163,6 +178,10 @@ void glist_delete(t_glist *x, t_gobj *y)
glist_getcanvas(x)->gl_name)), 1); glist_getcanvas(x)->gl_name)), 1);
canvas_setdeleting(canvas, wasdeleting); canvas_setdeleting(canvas, wasdeleting);
x->gl_valid = ++glist_valid; x->gl_valid = ++glist_valid;
if (late_rtext_free) {
fprintf(stderr,"glist_delete late_rtext_free\n");
rtext_free(rt);
}
} }
} }
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment