Re: [PD-dev] netsend (and more) crash bug SOLVED (patch included)

2010-01-19 Thread Hans-Christoph Steiner


So adding  glist_noselect(x);  to canvas_destroy_editor() seems to  
make sense.  The rest I think it better solved elsewhere.  Basically  
canvas_destroy_editor() calls glist_findrtext() which calls  
canvas_create_editor():


http://lists.puredata.info/pipermail/pd-dev/2010-01/014734.html

.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;
}
   }
   }
}

So, 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









"[T]he greatest purveyor of violence in the world today [is] my own  
government." - Martin Luther King, Jr.





___
Pd-dev mailing list
Pd-dev@iem.at
http://lists.puredata.info/listinfo/pd-dev


Re: [PD-dev] netsend (and more) crash bug SOLVED (patch included)

2009-11-18 Thread Hans-Christoph Steiner


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;
}
   }
   }
}

So, 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



___
Pd-dev mailing list
Pd-dev@iem.at
http://lists.puredata.info/listinfo/pd-dev


Re: [PD-dev] netsend (and more) crash bug SOLVED (patch included)

2009-11-18 Thread Ivica Ico Bukvic
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;
}
}
}
}

So, 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


___
Pd-dev mailing list
Pd-dev@iem.at
http://lists.puredata.info/listinfo/pd-dev