Hey Ico,
You should post this to the patch tracker once you are ready to submit it.
.hc
On Nov 18, 2009, at 11:40 PM, Ivica Ico Bukvic wrote:
Yay! Finally figured it out.
Please disregard my netsend patch, it's basically treating symptoms rather than the source.
It turns out that the patch I submitted before to fix canvas GOP toggle on/apply/off/apply crash has been the cause of the problem all along mainly because the final version had the second part nested, causing a lot of problems at close time.
Namely, the old version is like this (prior to my patch):
void canvas_destroy_editor(t_glist *x) { t_gobj *y; t_object *ob; if (x->gl_editor) { for (y = x->gl_list; y; y = y->g_next) if (ob = pd_checkobject(&y->g_pd)) rtext_free(glist_findrtext(x, ob)); editor_free(x->gl_editor, x); x->gl_editor = 0; } }
The currently broken patched version (the one I proposed earlier) is:
void canvas_destroy_editor(t_glist *x) { t_gobj *y; t_object *ob; if (x->gl_editor) glist_noselect(x); if (x->gl_editor && x->gl_list) { if (x->gl_list) { for (y = x->gl_list; y; y = y->g_next) if (ob = pd_checkobject(&y->g_pd)) rtext_free(glist_findrtext(x, ob));
//notice how this part is never reached if x->gl_list //condition is not satisfied, yet it is reached in //previous version... //this is the cause of //problems I've been experiencing if (x->gl_editor) { editor_free(x->gl_editor, x); x->gl_editor = 0; } }
} }
Sooooo, here's the correct version which still resolves two issues pointed out before without introducing any known regressions. The issues once again are:
#1 crash when creating a new patch->create a sub-patch->open sub-patch properties->enable GOP->apply->disable GOP (without closing properties)->apply #2 crash when creating a new patch->create a sub-patch->create an object *and leave elected->open sub-patch properties->enable GOP->apply->disable GOP (without closing properties)->apply
CORRECT VERSION:
void canvas_destroy_editor(t_glist *x) { t_gobj *y; t_object *ob; glist_noselect(x); //necessary to resolve crash #2 if (x->gl_editor) { if (x->gl_list) { //necessary to resolve crash #1 for (y = x->gl_list; y; y = y->g_next) if (ob = pd_checkobject(&y->g_pd)) rtext_free(glist_findrtext(x, ob)); } //fix to make this condition independent from x->gl_list if (x->gl_editor) { editor_free(x->gl_editor, x); x->gl_editor = 0; } } }
Cheers!
ico
----------------------------------------------------------------------------
Information wants to be free. -Stewart Brand