From 5da985c981285a67b630535fc35c69de44b9d3d4 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Mon, 28 Jun 2010 17:18:47 +0000 Subject: [PATCH] * edje: add an cache for group exist test. SVN revision: 49928 --- legacy/edje/src/lib/edje_convert.c | 3 +++ legacy/edje/src/lib/edje_load.c | 30 +++++++++++++++++++----------- legacy/edje/src/lib/edje_private.h | 2 ++ 3 files changed, 24 insertions(+), 11 deletions(-) diff --git a/legacy/edje/src/lib/edje_convert.c b/legacy/edje/src/lib/edje_convert.c index 7519afbf47..8a444899a9 100644 --- a/legacy/edje/src/lib/edje_convert.c +++ b/legacy/edje/src/lib/edje_convert.c @@ -127,7 +127,10 @@ _edje_file_convert(Eet_File *file, Old_Edje_File *oedf) edf->dangling = EINA_FALSE; edf->warning = EINA_FALSE; + /* Below you will find all memory structure that could be cleaned when under + memory pressure */ edf->collection_cache = NULL; + edf->collection_patterns = NULL; return edf; } diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 096f109a2f..bb7ed86a05 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -192,25 +192,32 @@ edje_file_group_exists(const char *file, const char *glob) edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL); if (edf != NULL) { - /* FIXME: cache the result in Edje_File structure */ - Edje_Part_Collection_Directory_Entry *ce; - Eina_Iterator *i; - Eina_List *l = NULL; Edje_Patterns *patterns; - i = eina_hash_iterator_data_new(edf->collection); + if (edf->collection_patterns) + { + patterns = edf->collection_patterns; + } + else + { + Edje_Part_Collection_Directory_Entry *ce; + Eina_Iterator *i; + Eina_List *l = NULL; - EINA_ITERATOR_FOREACH(i, ce) - l = eina_list_append(l, ce); + i = eina_hash_iterator_data_new(edf->collection); - eina_iterator_free(i); + EINA_ITERATOR_FOREACH(i, ce) + l = eina_list_append(l, ce); - patterns = edje_match_collection_dir_init(l); + eina_iterator_free(i); + + patterns = edje_match_collection_dir_init(l); + eina_list_free(l); + } succeed = edje_match_collection_dir_exec(patterns, glob); - edje_match_patterns_free(patterns); - eina_list_free(l); + edf->collection_patterns = patterns; _edje_cache_file_unref(edf); } @@ -1065,6 +1072,7 @@ _edje_file_free(Edje_File *edf) free(ecc); } + if (edf->collection_patterns) edje_match_patterns_free(edf->collection_patterns); if (edf->path) eina_stringshare_del(edf->path); if (edf->free_strings && edf->compiler) eina_stringshare_del(edf->compiler); if (edf->collection_cache) _edje_cache_coll_flush(edf); diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index a9d936c9ca..05fda4b63a 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -337,6 +337,8 @@ struct _Edje_File Eina_Hash *collection; Eina_List *collection_cache; + Edje_Patterns *collection_patterns; + Eet_File *ef; Old_Edje_File *oef;