From 98a7c6a3c3f49243687b4a745e269ed1f02db244 Mon Sep 17 00:00:00 2001 From: cedric Date: Tue, 31 May 2011 16:51:48 +0000 Subject: [PATCH] edje: improve speed when deleting text member class. git-svn-id: http://svn.enlightenment.org/svn/e/trunk/edje@59850 7cbeb6ba-43b4-40fd-8cce-4c39aea84d33 --- ChangeLog | 4 ++++ src/lib/edje_main.c | 2 ++ src/lib/edje_private.h | 2 ++ src/lib/edje_util.c | 25 +++++++++++++++---------- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/ChangeLog b/ChangeLog index deb1382..c75af5f 100644 --- a/ChangeLog +++ b/ChangeLog @@ -110,3 +110,7 @@ evas freeze and thaw calls. May help in certain pathological situations. +2011-05-27 Cedric Bail + + * Improve performance by avoiding walking eina_list for nothing + when deleting member_class. diff --git a/src/lib/edje_main.c b/src/lib/edje_main.c index 2aebe07..f802ec1 100644 --- a/src/lib/edje_main.c +++ b/src/lib/edje_main.c @@ -221,6 +221,8 @@ _edje_del(Edje *ed) eina_stringshare_del(cb->part); free(cb); } + + eina_hash_free(ed->members); free(ed); } diff --git a/src/lib/edje_private.h b/src/lib/edje_private.h index 2bd70e9..d2503a8 100644 --- a/src/lib/edje_private.h +++ b/src/lib/edje_private.h @@ -1004,6 +1004,8 @@ struct _Edje int table_programs_size; unsigned int table_parts_size; + Eina_Hash *members; + Edje_Perspective *persp; struct { diff --git a/src/lib/edje_util.c b/src/lib/edje_util.c index f28afa7..8d1a392 100644 --- a/src/lib/edje_util.c +++ b/src/lib/edje_util.c @@ -3674,33 +3674,38 @@ _edje_text_class_member_add(Edje *ed, const char *text_class) /* Get members list */ members = eina_hash_find(_edje_text_class_member_hash, text_class); - /* Remove members list */ - if (members) - eina_hash_del(_edje_text_class_member_hash, text_class, members); - /* Update the member list */ members = eina_list_prepend(members, ed); - /* Add the member list back */ + /* 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); + + /* Reset the member list to the right pointer */ if (!_edje_text_class_member_hash) _edje_text_class_member_hash = eina_hash_string_superfast_new(NULL); - eina_hash_add(_edje_text_class_member_hash, text_class, members); + eina_hash_set(_edje_text_class_member_hash, text_class, members); } void _edje_text_class_member_del(Edje *ed, const char *text_class) { 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; - eina_hash_del(_edje_text_class_member_hash, text_class, members); + lookup = eina_hash_find(ed->members, text_class); - members = eina_list_remove(members, ed); - if (members) - eina_hash_add(_edje_text_class_member_hash, text_class, members); + if (!lookup) return ; + + eina_hash_del(ed->members, text_class, lookup); + members = eina_list_remove_list(members, lookup); + + eina_hash_set(_edje_text_class_member_hash, text_class, members); } void -- 2.7.4