Use a hash for faster file global data lookup. If we hit a case where

per-object data lookup is slow, then this should be extended to include that.


SVN revision: 28591
This commit is contained in:
ningerso 2007-03-06 12:03:34 +00:00 committed by ningerso
parent d879ceda5c
commit 40f2626800
3 changed files with 37 additions and 15 deletions

View File

@ -69,6 +69,7 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
Edje_File *edf;
Edje_Part_Collection *edc;
Eet_File *ef;
Evas_List *l;
ef = eet_open(file, EET_FILE_MODE_READ);
if (!ef)
@ -102,6 +103,14 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
edf->references = 1;
_edje_textblock_style_parse_and_fix(edf);
for (l = edf->data; l; l = evas_list_remove(l, l->data))
{
Edje_Data *di = l->data;
edf->data_cache = evas_hash_add(edf->data_cache, evas_stringshare_add(di->key), di->value);
free(di);
}
edf->data = NULL;
if (!coll)
{
@ -117,6 +126,7 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
if (edc_ret) *edc_ret = edc;
eet_close(ef);
return edf;
}

View File

@ -426,23 +426,15 @@ edje_file_data_get(const char *file, const char *key)
char *str = NULL;
int error_ret = 0;
edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
if (edf != NULL)
if (key)
{
for (l = edf->data; l; l = l->next)
edf = _edje_cache_file_coll_open(file, NULL, &error_ret, NULL);
if ((edf != NULL) && (edf->data_cache != NULL))
{
Edje_Data *di;
di = l->data;
if ((di->key) && (key) && (!strcmp(di->key, key)))
{
if (!di->value) return NULL;
str = strdup(di->value);
break;
}
str = evas_hash_find(edf->data_cache, key);
if (str) str = strdup(str);
_edje_cache_file_unref(edf);
}
_edje_cache_file_unref(edf);
}
return str;
}
@ -581,6 +573,19 @@ _edje_file_del(Edje *ed)
ed->table_programs = NULL;
ed->table_programs_size = 0;
}
/**
* Used to free the cached data values that are stored in the data_cache
* hash table.
*/
static Evas_Bool data_cache_free(Evas_Hash *hash, const char *key,
void *data, void *fdata)
{
evas_stringshare_del(data);
return 1;
}
void
_edje_file_free(Edje_File *edf)
@ -657,7 +662,13 @@ _edje_file_free(Edje_File *edf)
if (edt->value) evas_stringshare_del(edt->value);
free(edt);
}
if (edf->data_cache)
{
evas_hash_foreach(edf->data_cache, data_cache_free, NULL);
evas_hash_free(edf->data_cache);
edf->data_cache = NULL;
}
while (edf->color_classes)
{
Edje_Color_Class *ecc;

View File

@ -229,6 +229,7 @@ struct _Edje_File
Evas_Hash *collection_hash;
Evas_List *collection_cache;
Evas_Hash *data_cache;
};
struct _Edje_Style