file and collection cache - this should remove a lot of file io... :)

SVN revision: 14081
This commit is contained in:
Carsten Haitzler 2005-04-03 11:43:00 +00:00
parent a469511a8b
commit c3d08acb8b
5 changed files with 348 additions and 83 deletions

View File

@ -155,6 +155,13 @@ extern "C" {
EAPI Evas_List *edje_file_collection_list (const char *file); EAPI Evas_List *edje_file_collection_list (const char *file);
EAPI void edje_file_collection_list_free (Evas_List *lst); EAPI void edje_file_collection_list_free (Evas_List *lst);
EAPI char *edje_file_data_get (const char *file, const char *key); EAPI char *edje_file_data_get (const char *file, const char *key);
EAPI void edje_file_cache_set (int count);
EAPI int edje_file_cache_get (void);
EAPI void edje_file_cache_flush (void);
EAPI void edje_collection_cache_set (int count);
EAPI int edje_collection_cache_get (void);
EAPI void edje_collection_cache_flush (void);
/* edje_util.c */ /* edje_util.c */
EAPI void edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3); EAPI void edje_color_class_set(const char *color_class, int r, int g, int b, int a, int r2, int g2, int b2, int a2, int r3, int g3, int b3, int a3);

View File

@ -6,6 +6,22 @@
#include "edje_private.h" #include "edje_private.h"
static Evas_Hash *_edje_file_hash = NULL; static Evas_Hash *_edje_file_hash = NULL;
static int _edje_file_cache_size = 16;
static Evas_List *_edje_file_cache = NULL;
static int _edje_collection_cache_size = 16;
static Edje_File *_edje_file_cache_find(char *path);
static void _edje_file_cache_clean(void);
static void _edje_file_cache_add(Edje_File *edf);
static void _edje_file_unref(Edje_File *edf);
static void _edje_file_ref(Edje_File *edf);
static void _edje_file_cleanup(void);
static Edje_Part_Collection *_edje_collection_find(Edje_File *edf, char *part);
static void _edje_collection_cache_clean(Edje_File *edf);
static void _edje_collection_cache_add(Edje_File *edf, Edje_Part_Collection *coll);
static void _edje_collection_ref(Edje_File *edf, Edje_Part_Collection *coll);
static void _edje_collection_unref(Edje_File *edf, Edje_Part_Collection *coll);
static void _edje_collection_cleanup(Edje_File *edf);
static void _edje_collection_free_part_description_free(Edje_Part_Description *desc); static void _edje_collection_free_part_description_free(Edje_Part_Description *desc);
#ifdef EDJE_PROGRAM_CACHE #ifdef EDJE_PROGRAM_CACHE
@ -344,8 +360,9 @@ edje_file_collection_list(const char *file)
Eet_File *ef = NULL; Eet_File *ef = NULL;
Evas_List *lst = NULL; Evas_List *lst = NULL;
Edje_File *ed_file; Edje_File *ed_file;
ed_file = evas_hash_find(_edje_file_hash, file); ed_file = evas_hash_find(_edje_file_hash, file);
if (!ed_file) ed_file = _edje_file_cache_find((char *)file);
if (!ed_file) if (!ed_file)
{ {
ef = eet_open((char *)file, EET_FILE_MODE_READ); ef = eet_open((char *)file, EET_FILE_MODE_READ);
@ -359,11 +376,8 @@ edje_file_collection_list(const char *file)
eet_close(ef); eet_close(ef);
ed_file->path = strdup(file); ed_file->path = strdup(file);
ed_file->collection_hash = NULL; ed_file->collection_hash = NULL;
ed_file->references = 1; ed_file->references = -1;
_edje_file_hash = evas_hash_add(_edje_file_hash, ed_file->path, ed_file);
} }
else
ed_file->references++;
if (ed_file->collection_dir) if (ed_file->collection_dir)
{ {
Evas_List *l; Evas_List *l;
@ -376,8 +390,8 @@ edje_file_collection_list(const char *file)
lst = evas_list_append(lst, strdup(ce->entry)); lst = evas_list_append(lst, strdup(ce->entry));
} }
} }
ed_file->references--; if (ed_file > 0) _edje_file_unref(ed_file);
if (ed_file->references <= 0) _edje_file_free(ed_file); else _edje_file_free(ed_file);
return lst; return lst;
} }
@ -412,6 +426,7 @@ edje_file_data_get(const char *file, const char *key)
char *str = NULL; char *str = NULL;
ed_file = evas_hash_find(_edje_file_hash, file); ed_file = evas_hash_find(_edje_file_hash, file);
if (!ed_file) ed_file = _edje_file_cache_find((char *)file);
if (!ed_file) if (!ed_file)
{ {
ef = eet_open((char *)file, EET_FILE_MODE_READ); ef = eet_open((char *)file, EET_FILE_MODE_READ);
@ -425,11 +440,9 @@ edje_file_data_get(const char *file, const char *key)
eet_close(ef); eet_close(ef);
ed_file->path = strdup(file); ed_file->path = strdup(file);
ed_file->collection_hash = NULL; ed_file->collection_hash = NULL;
ed_file->references = 1; ed_file->references = -1;
_edje_file_hash = evas_hash_add(_edje_file_hash, ed_file->path, ed_file); _edje_file_hash = evas_hash_add(_edje_file_hash, ed_file->path, ed_file);
} }
else
ed_file->references++;
for (l = ed_file->data; l; l = l->next) for (l = ed_file->data; l; l = l->next)
{ {
Edje_Data *di; Edje_Data *di;
@ -441,11 +454,226 @@ edje_file_data_get(const char *file, const char *key)
break; break;
} }
} }
ed_file->references--; if (ed_file > 0) _edje_file_unref(ed_file);
if (ed_file->references <= 0) _edje_file_free(ed_file); else _edje_file_free(ed_file);
return str; return str;
} }
void
edje_file_cache_set(int count)
{
if (count < 0) count = 0;
_edje_file_cache_size = count;
_edje_file_cache_clean();
}
int
edje_file_cache_get(void)
{
return _edje_file_cache_size;
}
void
edje_file_cache_flush(void)
{
int ps;
ps = _edje_file_cache_size;
_edje_file_cache_size = 0;
_edje_file_cache_clean();
_edje_file_cache_size = ps;
}
void
edje_collection_cache_set(int count)
{
Evas_List *l;
if (count < 0) count = 0;
_edje_collection_cache_size = count;
for (l = _edje_file_cache; l; l = l->next)
{
Edje_File *edf;
edf = l->data;
_edje_collection_cache_clean(edf);
}
}
int
edje_collection_cache_get(void)
{
return _edje_collection_cache_size;
}
void
edje_collection_cache_flush(void)
{
int ps;
Evas_List *l;
ps = _edje_collection_cache_size;
_edje_collection_cache_size = 0;
for (l = _edje_file_cache; l; l = l->next)
{
Edje_File *edf;
edf = l->data;
_edje_collection_cache_clean(edf);
}
_edje_collection_cache_size = ps;
}
static Edje_File *
_edje_file_cache_find(char *path)
{
Evas_List *l;
for (l = _edje_file_cache; l; l = l->next)
{
Edje_File *edf;
edf = l->data;
if (!strcmp(edf->path, path))
{
edf->references = 1;
_edje_file_cache = evas_list_remove_list(_edje_file_cache, l);
_edje_file_hash = evas_hash_add(_edje_file_hash, path, edf);
return edf;
}
}
return NULL;
}
static void
_edje_file_cache_clean(void)
{
int count;
count = evas_list_count(_edje_file_cache);
while ((_edje_file_cache) && (count > _edje_file_cache_size))
{
Edje_File *edf;
edf = _edje_file_cache->data;
_edje_file_cache = evas_list_remove_list(_edje_file_cache, _edje_file_cache);
_edje_file_free(edf);
count = evas_list_count(_edje_file_cache);
}
}
static void
_edje_file_cache_add(Edje_File *edf)
{
_edje_file_hash = evas_hash_del(_edje_file_hash, edf->path, edf);
_edje_file_cache = evas_list_append(_edje_file_cache, edf);
_edje_file_cache_clean();
}
static void
_edje_file_unref(Edje_File *edf)
{
edf->references--;
if (edf->references == 0) _edje_file_cache_add(edf);
}
static void
_edje_file_ref(Edje_File *edf)
{
edf->references++;
}
static void
_edje_file_cleanup(void)
{
int ps;
ps = _edje_file_cache_size;
_edje_file_cache_size = 0;
_edje_file_cache_clean();
_edje_file_cache_size = ps;
}
static Edje_Part_Collection *
_edje_collection_find(Edje_File *edf, char *part)
{
Evas_List *l;
Edje_Part_Collection *coll = NULL;
coll = evas_hash_find(edf->collection_hash, part);
if (coll)
{
coll->references++;
return coll;
}
for (l = edf->collection_cache; l; l = l->next)
{
coll = l->data;
if (!strcmp(coll->part, part))
{
coll->references = 1;
edf->collection_cache = evas_list_remove_list(edf->collection_cache, l);
edf->collection_hash = evas_hash_add(edf->collection_hash, part, coll);
return coll;
}
}
return NULL;
}
static void
_edje_collection_cache_clean(Edje_File *edf)
{
int count;
count = evas_list_count(edf->collection_cache);
while ((edf->collection_cache) && (count > _edje_collection_cache_size))
{
Edje_Part_Collection *coll;
coll = edf->collection_cache->data;
edf->collection_cache = evas_list_remove_list(edf->collection_cache, edf->collection_cache);
_edje_collection_free(edf, coll);
count = evas_list_count(edf->collection_cache);
}
}
static void
_edje_collection_cache_add(Edje_File *edf, Edje_Part_Collection *coll)
{
edf->collection_hash = evas_hash_del(edf->collection_hash, coll->part, coll);
edf->collection_cache = evas_list_append(edf->collection_cache, coll);
_edje_collection_cache_clean(edf);
}
static void
_edje_collection_ref(Edje_File *edf, Edje_Part_Collection *coll)
{
coll->references++;
}
static void
_edje_collection_unref(Edje_File *edf, Edje_Part_Collection *coll)
{
coll->references--;
if (coll->references == 0) _edje_collection_cache_add(edf, coll);
}
static void
_edje_collection_cleanup(Edje_File *edf)
{
int ps;
ps = _edje_collection_cache_size;
_edje_collection_cache_size = 0;
_edje_collection_cache_clean(edf);
_edje_collection_cache_size = ps;
}
void void
_edje_file_add(Edje *ed) _edje_file_add(Edje *ed)
{ {
@ -462,49 +690,49 @@ _edje_file_add(Edje *ed)
ed->file = evas_hash_find(_edje_file_hash, ed->path); ed->file = evas_hash_find(_edje_file_hash, ed->path);
if (ed->file) if (ed->file)
ed->file->references++; _edje_file_ref(ed->file);
else else
{ {
ef = eet_open(ed->path, EET_FILE_MODE_READ); ed->file = _edje_file_cache_find(ed->path);
if (!ef)
{
ed->load_error = EDJE_LOAD_ERROR_UNKNOWN_FORMAT;
return;
}
ed->file = eet_data_read(ef, _edje_edd_edje_file, "edje_file");
if (!ed->file) if (!ed->file)
{ {
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE; ef = eet_open(ed->path, EET_FILE_MODE_READ);
goto out; if (!ef)
{
ed->load_error = EDJE_LOAD_ERROR_UNKNOWN_FORMAT;
return;
}
ed->file = eet_data_read(ef, _edje_edd_edje_file, "edje_file");
if (!ed->file)
{
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE;
goto out;
}
if (ed->file->version != EDJE_FILE_VERSION)
{
_edje_file_free(ed->file);
ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_INCOMPATIBLE_FILE;
goto out;
}
ed->file->references = 1;
ed->file->path = strdup(ed->path);
if (!ed->file->collection_dir)
{
_edje_file_free(ed->file);
ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE;
goto out;
}
_edje_file_hash = evas_hash_add(_edje_file_hash, ed->file->path, ed->file);
} }
if (ed->file->version != EDJE_FILE_VERSION)
{
_edje_file_free(ed->file);
ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_INCOMPATIBLE_FILE;
goto out;
}
ed->file->references = 1;
ed->file->path = strdup(ed->path);
if (!ed->file->collection_dir)
{
_edje_file_free(ed->file);
ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE;
goto out;
}
_edje_file_hash = evas_hash_add(_edje_file_hash, ed->file->path, ed->file);
} }
ed->collection = evas_hash_find(ed->file->collection_hash, ed->part); ed->collection = _edje_collection_find(ed->file, ed->part);
if (ed->collection) if (!ed->collection)
{
ed->collection->references++;
}
else
{ {
for (l = ed->file->collection_dir->entries; l; l = l->next) for (l = ed->file->collection_dir->entries; l; l = l->next)
{ {
@ -527,6 +755,8 @@ _edje_file_add(Edje *ed)
if (!ef) ef = eet_open(ed->path, EET_FILE_MODE_READ); if (!ef) ef = eet_open(ed->path, EET_FILE_MODE_READ);
if (!ef) if (!ef)
{ {
_edje_file_unref(ed->file);
ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE; ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE;
goto out; goto out;
} }
@ -535,11 +765,12 @@ _edje_file_add(Edje *ed)
buf); buf);
if (!ed->collection) if (!ed->collection)
{ {
_edje_file_unref(ed->file);
ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE; ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE;
goto out; goto out;
} }
ed->collection->references = 1;
ed->file->collection_hash = evas_hash_add(ed->file->collection_hash, ed->part, ed->collection);
snprintf(buf, sizeof(buf), "scripts/%i", id); snprintf(buf, sizeof(buf), "scripts/%i", id);
data = eet_read(ef, buf, &size); data = eet_read(ef, buf, &size);
if (data) if (data)
@ -547,10 +778,14 @@ _edje_file_add(Edje *ed)
ed->collection->script = embryo_program_new(data, size); ed->collection->script = embryo_program_new(data, size);
free(data); free(data);
} }
ed->collection->part = strdup(ed->part);
ed->collection->references = 1;
ed->file->collection_hash = evas_hash_add(ed->file->collection_hash, ed->part, ed->collection);
} }
else else
{ {
_edje_file_free(ed->file); _edje_file_unref(ed->file);
ed->file = NULL; ed->file = NULL;
ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE; ed->load_error = EDJE_LOAD_ERROR_CORRUPT_FILE;
} }
@ -565,20 +800,24 @@ _edje_file_del(Edje *ed)
_edje_message_del(ed); _edje_message_del(ed);
_edje_block_violate(ed); _edje_block_violate(ed);
_edje_var_shutdown(ed); _edje_var_shutdown(ed);
if (ed->collection) if ((ed->file) && (ed->collection))
{ {
ed->collection->references--; Evas_List *l;
if (ed->collection->references <= 0)
for (l = ed->collection->parts; l; l = l->next)
{ {
_edje_embryo_script_shutdown(ed); Edje_Part *ep;
ed->file->collection_hash = evas_hash_del(ed->file->collection_hash, ed->part, ed->collection);
_edje_collection_free(ed, ed->collection); ep = l->data;
_edje_text_part_on_del(ed, ep);
_edje_color_class_on_del(ed, ep);
} }
_edje_collection_unref(ed->file, ed->collection);
ed->collection = NULL; ed->collection = NULL;
} }
if (ed->file) if (ed->file)
{ {
_edje_file_free(ed->file); _edje_file_unref(ed->file);
ed->file = NULL; ed->file = NULL;
} }
if (ed->parts) if (ed->parts)
@ -673,11 +912,6 @@ _edje_file_del(Edje *ed)
void void
_edje_file_free(Edje_File *edf) _edje_file_free(Edje_File *edf)
{ {
edf->references--;
if (edf->references > 0) return;
_edje_file_hash = evas_hash_del(_edje_file_hash, edf->path, edf);
if (edf->path) free(edf->path); if (edf->path) free(edf->path);
if (edf->compiler) free(edf->compiler); if (edf->compiler) free(edf->compiler);
if (edf->font_dir) if (edf->font_dir)
@ -735,12 +969,25 @@ _edje_file_free(Edje_File *edf)
free(edt); free(edt);
} }
} }
if (edf->collection_hash) evas_hash_free(edf->collection_hash); /* FIXME: free collection_hash and collection_cache */
if (edf->collection_hash)
{
printf("EDJE: EEEK! file collection hash is not empty!\n");
evas_hash_free(edf->collection_hash);
}
if (edf->collection_cache)
_edje_collection_cleanup(edf);
free(edf); free(edf);
} }
void void
_edje_collection_free(Edje *ed, Edje_Part_Collection *ec) _edje_file_cache_shutdown(void)
{
_edje_file_cleanup();
}
void
_edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec)
{ {
while (ec->programs) while (ec->programs)
{ {
@ -777,8 +1024,6 @@ _edje_collection_free(Edje *ed, Edje_Part_Collection *ec)
ep = ec->parts->data; ep = ec->parts->data;
ec->parts = evas_list_remove(ec->parts, ep); ec->parts = evas_list_remove(ec->parts, ep);
_edje_text_part_on_del(ed, ep);
_edje_color_class_on_del(ed, ep);
if (ep->name) free(ep->name); if (ep->name) free(ep->name);
if (ep->default_desc) if (ep->default_desc)
{ {
@ -808,6 +1053,8 @@ _edje_collection_free(Edje *ed, Edje_Part_Collection *ec)
free(edt); free(edt);
} }
} }
if (ec->part)
free(ec->part);
#ifdef EDJE_PROGRAM_CACHE #ifdef EDJE_PROGRAM_CACHE
if (ec->prog_cache.no_matches) evas_hash_free(ec->prog_cache.no_matches); if (ec->prog_cache.no_matches) evas_hash_free(ec->prog_cache.no_matches);
if (ec->prog_cache.matches) if (ec->prog_cache.matches)

View File

@ -39,6 +39,7 @@ edje_shutdown(void)
initted--; initted--;
if (initted > 0) return initted; if (initted > 0) return initted;
_edje_file_cache_shutdown();
_edje_message_shutdown(); _edje_message_shutdown();
_edje_edd_free(); _edje_edd_free();
_edje_color_class_members_free(); _edje_color_class_members_free();

View File

@ -23,6 +23,10 @@
#include <alloca.h> #include <alloca.h>
#endif #endif
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#ifndef ABS #ifndef ABS
#define ABS(x) (x < 0 ? -x : x) #define ABS(x) (x < 0 ? -x : x)
#endif #endif
@ -149,11 +153,13 @@ struct _Edje_File
Edje_Part_Collection_Directory *collection_dir; Edje_Part_Collection_Directory *collection_dir;
Evas_List *data; Evas_List *data;
Evas_Hash *collection_hash;
int references; int references;
char *compiler; char *compiler;
int version; int version;
int feature_ver; int feature_ver;
Evas_Hash *collection_hash;
Evas_List *collection_cache;
}; };
/*----------*/ /*----------*/
@ -273,6 +279,8 @@ struct _Edje_Part_Collection
#endif #endif
Embryo_Program *script; /* all the embryo script code for this group */ Embryo_Program *script; /* all the embryo script code for this group */
char *part;
}; };
struct _Edje_Part struct _Edje_Part
@ -755,7 +763,8 @@ void _edje_edd_free(void);
void _edje_file_add(Edje *ed); void _edje_file_add(Edje *ed);
void _edje_file_del(Edje *ed); void _edje_file_del(Edje *ed);
void _edje_file_free(Edje_File *edf); void _edje_file_free(Edje_File *edf);
void _edje_collection_free(Edje *ed, Edje_Part_Collection *ec); void _edje_file_cache_shutdown(void);
void _edje_collection_free(Edje_File *edf, Edje_Part_Collection *ec);
Edje *_edje_add(Evas_Object *obj); Edje *_edje_add(Evas_Object *obj);
void _edje_del(Edje *ed); void _edje_del(Edje *ed);

View File

@ -204,7 +204,8 @@ _edje_text_part_on_add(Edje *ed, Edje_Real_Part *ep)
} }
if ((pt->default_desc) && (pt->default_desc->text.text_class)) _edje_text_class_member_add(ed, pt->default_desc->text.text_class); if ((pt->default_desc) && (pt->default_desc->text.text_class))
_edje_text_class_member_add(ed, pt->default_desc->text.text_class);
for (tmp = pt->other_desc; tmp; tmp = tmp->next) for (tmp = pt->other_desc; tmp; tmp = tmp->next)
{ {
Edje_Part_Description *desc; Edje_Part_Description *desc;
@ -244,15 +245,15 @@ _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
if ((pt->default_desc) && (pt->default_desc->text.text_class)) if ((pt->default_desc) && (pt->default_desc->text.text_class))
{ {
_edje_text_class_member_del(ed, pt->default_desc->text.text_class); _edje_text_class_member_del(ed, pt->default_desc->text.text_class);
free(pt->default_desc->text.text_class); free(pt->default_desc->text.text_class);
pt->default_desc->text.text_class = NULL; pt->default_desc->text.text_class = NULL;
} }
if (pt->default_desc && pt->default_desc->color_class) if (pt->default_desc && pt->default_desc->color_class)
{ {
_edje_color_class_member_del(ed, pt->default_desc->color_class); _edje_color_class_member_del(ed, pt->default_desc->color_class);
free (pt->default_desc->color_class); free (pt->default_desc->color_class);
pt->default_desc->color_class = NULL; pt->default_desc->color_class = NULL;
} }
for (tmp = pt->other_desc; tmp; tmp = tmp->next) for (tmp = pt->other_desc; tmp; tmp = tmp->next)
@ -266,13 +267,13 @@ _edje_text_part_on_del(Edje *ed, Edje_Part *pt)
free(desc->text.text_class); free(desc->text.text_class);
desc->text.text_class = NULL; desc->text.text_class = NULL;
} }
if (desc->color_class) if (desc->color_class)
{ {
_edje_color_class_member_del(ed, desc->color_class); _edje_color_class_member_del(ed, desc->color_class);
free(desc->color_class); free(desc->color_class);
desc->color_class = NULL; desc->color_class = NULL;
} }
} }
} }