Hi, On Wed, 19 Aug 2015 20:53:53 -0700 Carsten Haitzler <ras...@rasterman.com> wrote:
> raster pushed a commit to branch master. > > http://git.enlightenment.org/core/efl.git/commit/?id=8689d54471aafdd7a5b5a27ce116bf2ab68c1042 > > commit 8689d54471aafdd7a5b5a27ce116bf2ab68c1042 > Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> > Date: Thu Aug 20 12:50:52 2015 +0900 > > eo - destruction - ensure child is removed from parent child list > > this follows on from cbc1a217bfc8b5c6dd94f0448f19245c43eb05e0 as > this code was correct, but was then causing bugs due to children > staying in their parent lists. this should never have happened and > this is really bad. this fixes this and ensures children on > destruction are gone from their parent lists. > > @fix > --- > src/lib/eo/eo_base_class.c | 14 ++++++++++---- > 1 file changed, 10 insertions(+), 4 deletions(-) > > diff --git a/src/lib/eo/eo_base_class.c b/src/lib/eo/eo_base_class.c > index fe52203..9f8252b 100644 > --- a/src/lib/eo/eo_base_class.c > +++ b/src/lib/eo/eo_base_class.c > @@ -977,7 +977,6 @@ EOLIAN static void > _eo_base_destructor(Eo *obj, Eo_Base_Data *pd) > { > Eo *child; > - Eo_Base_Data *child_pd; > > DBG("%p - %s.", obj, eo_class_name_get(MY_CLASS)); > > @@ -987,11 +986,18 @@ _eo_base_destructor(Eo *obj, Eo_Base_Data *pd) > while (pd->children) > { > child = eina_list_data_get(pd->children); > - child_pd = eo_data_scope_get(child, EO_BASE_CLASS); > - pd->children = eina_list_remove_list(pd->children, > pd->children); > - child_pd->parent_list = NULL; > eo_do(child, eo_parent_set(NULL)); > } > + // remove child from its parent on destruction - ha to be done > + if (pd->parent) > + { > + Eo_Base_Data *parent_pd; > + > + parent_pd = eo_data_scope_get(pd->parent, EO_BASE_CLASS); > + parent_pd->children = > eina_list_remove_list(parent_pd->children, > + pd->parent_list); > + pd->parent_list = NULL; > + } > > _eo_generic_data_del_all(pd); > _wref_destruct(pd); > The parent should never be !NULL when reaching the destructor. Imo, this code has not to be here. Instead, an error message should be displayed in the case the parent is still connected to the object. There is a bug but definitely the solution doesn't have to be here. I think this issue may happen if eo_del is never called and eo_unref is called instead. We need to check inside _eo_unref that the parent is NULL and display an error message. Tom, any thoughts? ------------------------------------------------------------------------------ _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel