On Thu, 20 Aug 2015 09:09:44 +0300 Daniel Zaoui <daniel.za...@samsung.com> said:

> 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?

eo_suite simple examples show this case. in fact i think the test case is
broken too... but as such i followed the code, and read it. if you destruct a
child, the parent still has a list entry pointing to it.

_eo_unref() gets to 0, and _eo_del_internal() calls the destructor... this does
nothing in the way of removing from a parent (read it). the base class
destructor is the only place to do this... and so i added it.

look at

START_TEST(eo_refs)

here:

   obj = eo_add(SIMPLE_CLASS, NULL);
   obj2 = eo_add(SIMPLE_CLASS, obj);
   eo_unref(obj2);
   eo_ref(obj2);
   eo_del(obj2);
   eo_unref(obj);

we create obj, then obj2 as a child of obj, then unref obj2. after this unref
of obj2, obj2 was still in the child list of obj. this isn't a complex case.
its an insanely simple one. our own test cases never caught this issue until i
"fixed" the code above that pointed this out. the base class destructor never
removes an object from its parent list. no code in the destructor to do that at
all. i fixed that :)


-- 
------------- Codito, ergo sum - "I code, therefore I am" --------------
The Rasterman (Carsten Haitzler)    ras...@rasterman.com


------------------------------------------------------------------------------
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to