From 995527500a604c834c481c96a6c935812ac55f1e Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 31 May 2011 16:51:48 +0000 Subject: [PATCH] edje: improve speed when deleting text member class. SVN revision: 59850 --- legacy/edje/ChangeLog | 4 ++++ legacy/edje/src/lib/edje_main.c | 2 ++ legacy/edje/src/lib/edje_private.h | 2 ++ legacy/edje/src/lib/edje_util.c | 25 +++++++++++++++---------- 4 files changed, 23 insertions(+), 10 deletions(-) diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index deb1382dfd..c75af5fa19 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/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/legacy/edje/src/lib/edje_main.c b/legacy/edje/src/lib/edje_main.c index 2aebe07eb7..f802ec110d 100644 --- a/legacy/edje/src/lib/edje_main.c +++ b/legacy/edje/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/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 2bd70e91de..d2503a8fb4 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/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/legacy/edje/src/lib/edje_util.c b/legacy/edje/src/lib/edje_util.c index f28afa7714..8d1a392a5f 100644 --- a/legacy/edje/src/lib/edje_util.c +++ b/legacy/edje/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