[PD-dev] netsend (and more) crash bug SOLVED (patch included)
Ivica Ico Bukvic
ico at vt.edu
Thu Nov 19 05:40:48 CET 2009
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
More information about the Pd-dev
mailing list