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