On Wed, 22 Jun 2011 07:51:53 -0700 "Enlightenment SVN"
<no-re...@enlightenment.org> said:

so... what about colorclasses? they probably have the same problems as the last
2 textclass commit fixes. :)

> Log:
> edje: fix huge memory leak.
>   
> 
> Author:       cedric
> Date:         2011-06-22 07:51:53 -0700 (Wed, 22 Jun 2011)
> New Revision: 60593
> Trac:         http://trac.enlightenment.org/e/changeset/60593
> 
> Modified:
>   trunk/edje/src/lib/edje_main.c trunk/edje/src/lib/edje_private.h
> trunk/edje/src/lib/edje_util.c 
> 
> Modified: trunk/edje/src/lib/edje_main.c
> ===================================================================
> --- trunk/edje/src/lib/edje_main.c    2011-06-22 14:04:09 UTC (rev 60592)
> +++ trunk/edje/src/lib/edje_main.c    2011-06-22 14:51:53 UTC (rev 60593)
> @@ -150,7 +150,7 @@
>  _text_class_member_free(const Eina_Hash *hash __UNUSED__,
>                       const void *key,
>                       void *data,
> -                     void *fdata)
> +                     void *fdata __UNUSED__)
>  {
>     _edje_text_class_member_direct_del(key, data);
>     return EINA_TRUE;
> 
> Modified: trunk/edje/src/lib/edje_private.h
> ===================================================================
> --- trunk/edje/src/lib/edje_private.h 2011-06-22 14:04:09 UTC (rev
> 60592) +++ trunk/edje/src/lib/edje_private.h  2011-06-22 14:51:53 UTC
> (rev 60593) @@ -1545,7 +1545,7 @@
>  Edje_Text_Class  *_edje_text_class_find(Edje *ed, const char *text_class);
>  void              _edje_text_class_member_add(Edje *ed, const char
> *text_class); void              _edje_text_class_member_del(Edje *ed, const
> char *text_class); -void              _edje_text_class_member_direct_del
> (const char *text_class, Eina_List *lookup); +void
> _edje_text_class_member_direct_del(const char *text_class, void *lookup);
> void              _edje_text_class_members_free(void); void
> _edje_text_class_hash_free(void); 
> 
> Modified: trunk/edje/src/lib/edje_util.c
> ===================================================================
> --- trunk/edje/src/lib/edje_util.c    2011-06-22 14:04:09 UTC (rev 60592)
> +++ trunk/edje/src/lib/edje_util.c    2011-06-22 14:51:53 UTC (rev 60593)
> @@ -32,6 +32,14 @@
>     Eina_List *list;
>  };
>  
> +typedef struct _Edje_List_Refcount Edje_List_Refcount;
> +struct _Edje_List_Refcount
> +{
> +   EINA_REFCOUNT;
> +
> +   Eina_List *lookup;
> +};
> +
>  static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const
> void *key, void *data, void *fdata); static Eina_Bool
> _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void
> *data, void *fdata); static void _edje_object_image_preload_cb(void *data,
> Evas *e, Evas_Object *obj, void *event_info); @@ -3711,34 +3719,46 @@ 
>  void
>  _edje_text_class_member_direct_del(const char *text_class,
> -                                   Eina_List *lookup)
> +                                   void *l)
>  {
> +   Edje_List_Refcount *lookup = l;
>     Eina_List *members;
>  
>     members = eina_hash_find(_edje_text_class_member_hash, text_class);
> -   members = eina_list_remove_list(members, lookup);
> +   members = eina_list_remove_list(members, lookup->lookup);
>     eina_hash_set(_edje_text_class_member_hash, text_class, members);
> +   free(lookup);
>  }
>  
>  void
>  _edje_text_class_member_add(Edje *ed, const char *text_class)
>  {
> +   Edje_List_Refcount *lookup;
>     Eina_List *members;
>  
>     if ((!ed) || (!text_class)) return;
>  
> +   lookup = eina_hash_find(ed->members, text_class);
> +   if (lookup)
> +     {
> +        EINA_REFCOUNT_REF(lookup);
> +        return;
> +     }
> +
> +   lookup = malloc(sizeof (Edje_List_Refcount));
> +   if (!lookup) return ;
> +   EINA_REFCOUNT_INIT(lookup);
> +
>     /* Get members list */
>     members = eina_hash_find(_edje_text_class_member_hash, text_class);
>  
>     /* Update the member list */
> -   members = eina_list_prepend(members, ed);
> -   if (eina_list_count(members) > 50000)
> -      printf("ERRRRRRRRRROR. CEDRIC BROKE ME! I NOW LEAK TEXTCLASSES\n");
> +   lookup->lookup = members = eina_list_prepend(members, ed);
>  
>     /* Don't loose track of members list */
>     if (!ed->members)
>       ed->members = eina_hash_string_small_new(NULL);
> -   eina_hash_set(ed->members, text_class, members);
> +   eina_hash_add(ed->members, text_class, lookup);
>  
>     /* Reset the member list to the right pointer */
>     if (!_edje_text_class_member_hash)
> @@ -3749,21 +3769,24 @@
>  void
>  _edje_text_class_member_del(Edje *ed, const char *text_class)
>  {
> +   Edje_List_Refcount *lookup;
>     Eina_List *members;
> -   Eina_List *lookup;
>  
>     if ((!ed) || (!text_class)) return;
>     members = eina_hash_find(_edje_text_class_member_hash, text_class);
>     if (!members) return;
>  
>     lookup = eina_hash_find(ed->members, text_class);
> -
>     if (!lookup) return ;
>  
> -   eina_hash_del(ed->members, text_class, lookup);
> -   members = eina_list_remove_list(members, lookup);
> +   EINA_REFCOUNT_UNREF(lookup)
> +   {
> +      members = eina_list_remove_list(members, lookup->lookup);
> +      eina_hash_set(_edje_text_class_member_hash, text_class, members);
>  
> -   eina_hash_set(_edje_text_class_member_hash, text_class, members);
> +      eina_hash_del(ed->members, text_class, lookup);
> +      free(lookup);
> +   }
>  }
>  
>  void
> 
> 
> ------------------------------------------------------------------------------
> Simplify data backup and recovery for your virtual environment with vRanger.
> Installation's a snap, and flexible recovery options mean your data is safe,
> secure and there when you need it. Data protection magic?
> Nope - It's vRanger. Get your free trial download today.
> http://p.sf.net/sfu/quest-sfdev2dev
> _______________________________________________
> enlightenment-svn mailing list
> enlightenment-...@lists.sourceforge.net
> https://lists.sourceforge.net/lists/listinfo/enlightenment-svn
> 


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


------------------------------------------------------------------------------
Simplify data backup and recovery for your virtual environment with vRanger.
Installation's a snap, and flexible recovery options mean your data is safe,
secure and there when you need it. Data protection magic?
Nope - It's vRanger. Get your free trial download today.
http://p.sf.net/sfu/quest-sfdev2dev
_______________________________________________
enlightenment-devel mailing list
enlightenment-devel@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/enlightenment-devel

Reply via email to