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

Reply via email to