Move to eina_hash. Nothing should break, but if you experience any unexpected behaviour

please ping me on #edevelop.



SVN revision: 38183
This commit is contained in:
Cedric BAIL 2008-12-17 14:26:47 +00:00
parent 05af27f999
commit e33474c92f
10 changed files with 136 additions and 59 deletions

View File

@ -30,6 +30,19 @@ _edje_str_direct_free(const char *str)
{ {
} }
static void *
_edje_eina_hash_add_alloc(void *hash, const char *key, void *data)
{
Eina_Hash *result = hash;
if (!result) result = eina_hash_string_small_new(NULL);
if (!result) return NULL;
eina_hash_add(result, key, data);
return result;
}
void void
source_edd(void) source_edd(void)
{ {
@ -38,15 +51,15 @@ source_edd(void)
eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION; eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
eddc.func.mem_alloc = NULL; eddc.func.mem_alloc = NULL;
eddc.func.mem_free = NULL; eddc.func.mem_free = NULL;
eddc.func.str_alloc = (char *(*)(const char *))eina_stringshare_add; eddc.func.str_alloc = eina_stringshare_add;
eddc.func.str_free = (void (*)(const char *))eina_stringshare_del; eddc.func.str_free = eina_stringshare_del;
eddc.func.list_next = (void *(*)(void *))eina_list_next; eddc.func.list_next = eina_list_next;
eddc.func.list_append = (void *(*)(void *, void *))eina_list_append; eddc.func.list_append = eina_list_append;
eddc.func.list_data = (void *(*)(void *))eina_list_data_get; eddc.func.list_data = eina_list_data_get;
eddc.func.list_free = (void *(*)(void *))eina_list_free; eddc.func.list_free = eina_list_free;
eddc.func.hash_foreach = (void (*)(void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach; eddc.func.hash_foreach = eina_hash_foreach;
eddc.func.hash_add = (void *(*)(void *, const char *, void *))evas_hash_add; eddc.func.hash_add = _edje_eina_hash_add_alloc;
eddc.func.hash_free = (void (*)(void *))evas_hash_free; eddc.func.hash_free = eina_hash_free;
eddc.func.str_direct_alloc = _edje_str_direct_alloc; eddc.func.str_direct_alloc = _edje_str_direct_alloc;
eddc.func.str_direct_free = _edje_str_direct_free; eddc.func.str_direct_free = _edje_str_direct_free;

View File

@ -28,7 +28,7 @@ void *alloca (size_t);
#include "edje_private.h" #include "edje_private.h"
static Eina_Hash *_edje_file_hash = NULL; static Evas_Hash *_edje_file_hash = NULL;
static int _edje_file_cache_size = 16; static int _edje_file_cache_size = 16;
static Eina_List *_edje_file_cache = NULL; static Eina_List *_edje_file_cache = NULL;
@ -69,7 +69,9 @@ _edje_file_coll_open(Edje_File *edf, const char *coll)
edc->part = eina_stringshare_add(coll); edc->part = eina_stringshare_add(coll);
edc->references = 1; edc->references = 1;
edf->collection_hash = evas_hash_add(edf->collection_hash, coll, edc); if (!edf->collection_hash)
edf->collection_hash = eina_hash_string_superfast_new(NULL);
eina_hash_add(edf->collection_hash, coll, edc);
return edc; return edc;
} }
@ -78,6 +80,9 @@ _edje_font_hash(Edje_File *edf)
{ {
int count = 0; int count = 0;
if (!edf->font_hash)
edf->font_hash = eina_hash_string_superfast_new(NULL);
if (edf->font_dir) if (edf->font_dir)
{ {
Eina_List *l; Eina_List *l;
@ -96,7 +101,7 @@ _edje_font_hash(Edje_File *edf)
if (edf->free_strings) if (edf->free_strings)
eina_stringshare_del(fnt->entry); eina_stringshare_del(fnt->entry);
fnt->entry = fnt->path + 6; fnt->entry = fnt->path + 6;
edf->font_hash = evas_hash_direct_add(edf->font_hash, fnt->entry, fnt); eina_hash_direct_add(edf->font_hash, fnt->entry, fnt);
count++; count++;
} }
@ -156,8 +161,10 @@ _edje_file_open(const char *file, const char *coll, int *error_ret, Edje_Part_Co
_edje_textblock_style_parse_and_fix(edf); _edje_textblock_style_parse_and_fix(edf);
if (!edf->data_cache)
edf->data_cache = eina_hash_string_superfast_new(NULL);
EINA_LIST_FOREACH(edf->data, l, di) EINA_LIST_FOREACH(edf->data, l, di)
edf->data_cache = evas_hash_add(edf->data_cache, eina_stringshare_add(di->key), di->value); eina_hash_add(edf->data_cache, di->key, di->value);
if (coll) if (coll)
{ {
@ -184,10 +191,15 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
Edje_Part_Collection *edc; Edje_Part_Collection *edc;
Edje_Part *ep; Edje_Part *ep;
edf = evas_hash_find(_edje_file_hash, file); if (!_edje_file_hash)
_edje_file_hash = eina_hash_string_superfast_new(NULL);
edf = eina_hash_find(_edje_file_hash, file);
if (edf) if (edf)
{ {
edf->references++; edf->references++;
if (!edf->collection_hash)
edf->collection_hash = eina_hash_string_superfast_new(NULL);
} }
else else
{ {
@ -197,7 +209,7 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
{ {
edf->references = 1; edf->references = 1;
_edje_file_cache = eina_list_remove_list(_edje_file_cache, l); _edje_file_cache = eina_list_remove_list(_edje_file_cache, l);
_edje_file_hash = evas_hash_add(_edje_file_hash, file, edf); eina_hash_add(_edje_file_hash, file, edf);
break; break;
} }
edf = NULL; edf = NULL;
@ -207,13 +219,13 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
{ {
edf = _edje_file_open(file, coll, error_ret, edc_ret); edf = _edje_file_open(file, coll, error_ret, edc_ret);
if (!edf) return NULL; if (!edf) return NULL;
_edje_file_hash = evas_hash_add(_edje_file_hash, file, edf); eina_hash_add(_edje_file_hash, file, edf);
return edf; return edf;
} }
if (!coll) return edf; if (!coll) return edf;
edc = evas_hash_find(edf->collection_hash, coll); edc = eina_hash_find(edf->collection_hash, coll);
if (edc) if (edc)
{ {
edc->references++; edc->references++;
@ -226,7 +238,7 @@ _edje_cache_file_coll_open(const char *file, const char *coll, int *error_ret, E
{ {
edc->references = 1; edc->references = 1;
edf->collection_cache = eina_list_remove_list(edf->collection_cache, l); edf->collection_cache = eina_list_remove_list(edf->collection_cache, l);
edf->collection_hash = evas_hash_add(edf->collection_hash, coll, edc); eina_hash_add(edf->collection_hash, coll, edc);
break; break;
} }
edc = NULL; edc = NULL;
@ -345,7 +357,12 @@ _edje_cache_coll_unref(Edje_File *edf, Edje_Part_Collection *edc)
{ {
edc->references--; edc->references--;
if (edc->references != 0) return; if (edc->references != 0) return;
edf->collection_hash = evas_hash_del(edf->collection_hash, edc->part, edc); eina_hash_del(edf->collection_hash, edc->part, edc);
if (!eina_hash_population(edf->collection_hash))
{
eina_hash_free(edf->collection_hash);
edf->collection_hash = NULL;
}
edf->collection_cache = eina_list_prepend(edf->collection_cache, edc); edf->collection_cache = eina_list_prepend(edf->collection_cache, edc);
_edje_cache_coll_clean(edf); _edje_cache_coll_clean(edf);
} }
@ -372,7 +389,13 @@ _edje_cache_file_unref(Edje_File *edf)
{ {
edf->references--; edf->references--;
if (edf->references != 0) return; if (edf->references != 0) return;
_edje_file_hash = evas_hash_del(_edje_file_hash, edf->path, edf);
eina_hash_del(_edje_file_hash, edf->path, edf);
if (!eina_hash_population(_edje_file_hash))
{
eina_hash_free(_edje_file_hash);
_edje_file_hash = NULL;
}
_edje_file_cache = eina_list_prepend(_edje_file_cache, edf); _edje_file_cache = eina_list_prepend(_edje_file_cache, edf);
_edje_cache_file_clean(); _edje_cache_file_clean();
} }

View File

@ -777,7 +777,7 @@ _edje_part_recalc_single(Edje *ed,
{ {
Edje_Font_Directory_Entry *fnt; Edje_Font_Directory_Entry *fnt;
fnt = evas_hash_find(ed->file->font_hash, font); fnt = eina_hash_find(ed->file->font_hash, font);
if (fnt) if (fnt)
{ {

View File

@ -75,6 +75,16 @@ _edje_str_direct_free(const char *str)
{ {
} }
static Eina_Hash *
_edje_eina_hash_add_alloc(Eina_Hash *hash, const char *key, void *data)
{
if (!hash) hash = eina_hash_string_small_new(NULL);
if (!hash) return NULL;
eina_hash_add(hash, key, data);
return hash;
}
void void
_edje_edd_setup(void) _edje_edd_setup(void)
{ {
@ -89,9 +99,9 @@ _edje_edd_setup(void)
eddc.func.list_append = (void *(*)(void *, void *))eina_list_append; eddc.func.list_append = (void *(*)(void *, void *))eina_list_append;
eddc.func.list_data = (void *(*)(void *))eina_list_data_get; eddc.func.list_data = (void *(*)(void *))eina_list_data_get;
eddc.func.list_free = (void *(*)(void *))eina_list_free; eddc.func.list_free = (void *(*)(void *))eina_list_free;
eddc.func.hash_foreach = (void (*)(void *, int (*)(void *, const char *, void *, void *), void *))evas_hash_foreach; eddc.func.hash_foreach = (void (*)(const Eina_Hash *, Eina_Bool (*)(const Eina_Hash *, const void *, void *, void *), void *))eina_hash_foreach;
eddc.func.hash_add = (void *(*)(void *, const char *, void *))evas_hash_add; eddc.func.hash_add = (Eina_Hash* (*)(Eina_Hash *, const char *, void *)) _edje_eina_hash_add_alloc;
eddc.func.hash_free = (void (*)(void *))evas_hash_free; eddc.func.hash_free = (void (*)(void *))eina_hash_free;
eddc.func.str_direct_alloc = _edje_str_direct_alloc; eddc.func.str_direct_alloc = _edje_str_direct_alloc;
eddc.func.str_direct_free = _edje_str_direct_free; eddc.func.str_direct_free = _edje_str_direct_free;

View File

@ -716,7 +716,9 @@ edje_edit_group_add(Evas_Object *obj, const char *name)
//cd = mem_alloc(SZ(Code)); //cd = mem_alloc(SZ(Code));
//codes = eina_list_append(codes, cd); //codes = eina_list_append(codes, cd);
ed->file->collection_hash = evas_hash_add(ed->file->collection_hash, name, pc); if (!ed->file->collection_hash)
ed->file->collection_hash = eina_hash_string_superfast_new(NULL);
eina_hash_add(ed->file->collection_hash, name, pc);
return 1; return 1;
} }
@ -828,10 +830,12 @@ edje_edit_group_name_set(Evas_Object *obj, const char *new_name)
{ {
if (pc->id == pce->id) if (pc->id == pce->id)
{ {
ed->file->collection_hash = evas_hash_del(ed->file->collection_hash, eina_hash_del(ed->file->collection_hash,
pce->entry, NULL); pce->entry, NULL);
ed->file->collection_hash = evas_hash_add(ed->file->collection_hash, if (!ed->file->collection_hash)
new_name, pc); ed->file->collection_hash = eina_hash_string_superfast_new(NULL);
eina_hash_add(ed->file->collection_hash,
new_name, pc);
//if (pce->entry && //TODO Also this cause segv //if (pce->entry && //TODO Also this cause segv
// !eet_dictionary_string_check(eet_dictionary_get(ed->file->ef), pce->entry)) // !eet_dictionary_string_check(eet_dictionary_get(ed->file->ef), pce->entry))
@ -1295,7 +1299,7 @@ EAPI Eina_List *
edje_edit_style_tags_list_get(Evas_Object * obj, const char* style) edje_edit_style_tags_list_get(Evas_Object * obj, const char* style)
{ {
Eina_List *tags = NULL; Eina_List *tags = NULL;
Eina_List *ll; Eina_List *l, *ll;
Edje_Style *s; Edje_Style *s;
Edje_Style_Tag *t; Edje_Style_Tag *t;
@ -3310,7 +3314,9 @@ edje_edit_font_add(Evas_Object *obj, const char* path)
fnt->path = mem_strdup(buf); fnt->path = mem_strdup(buf);
ed->file->font_dir->entries = eina_list_append(ed->file->font_dir->entries, fnt); ed->file->font_dir->entries = eina_list_append(ed->file->font_dir->entries, fnt);
ed->file->font_hash = evas_hash_direct_add(ed->file->font_hash, fnt->entry, fnt); if (!ed->file->font_hash)
ed->file->font_hash = eina_hash_string_superfast_new(NULL);
eina_hash_direct_add(ed->file->font_hash, fnt->entry, fnt);
} }
return 1; return 1;
@ -5397,6 +5403,20 @@ _edje_edit_str_direct_free(const char *str)
{ {
} }
static void *
_edje_eina_hash_add_alloc(void *hash, const void *key, void *data)
{
Eina_Hash *result = hash;
if (!result) result = eina_hash_string_small_new(NULL);
if (!result) return NULL;
eina_hash_add(result, key, data);
return result;
}
static Eet_Data_Descriptor *_srcfile_edd = NULL; static Eet_Data_Descriptor *_srcfile_edd = NULL;
static Eet_Data_Descriptor *_srcfile_list_edd = NULL; static Eet_Data_Descriptor *_srcfile_list_edd = NULL;
@ -5408,15 +5428,15 @@ source_edd(void)
eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION; eddc.version = EET_DATA_DESCRIPTOR_CLASS_VERSION;
eddc.func.mem_alloc = NULL; eddc.func.mem_alloc = NULL;
eddc.func.mem_free = NULL; eddc.func.mem_free = NULL;
eddc.func.str_alloc = (char *(*)(const char *))eina_stringshare_add; eddc.func.str_alloc = eina_stringshare_add;
eddc.func.str_free = (void (*)(const char *))eina_stringshare_del; eddc.func.str_free = eina_stringshare_del;
eddc.func.list_next = (void *(*)(void *))eina_list_next; eddc.func.list_next = eina_list_next;
eddc.func.list_append = (void *(*)(void *, void *))eina_list_append; eddc.func.list_append = eina_list_append;
eddc.func.list_data = (void *(*)(void *))eina_list_data_get; eddc.func.list_data = eina_list_data_get;
eddc.func.list_free = (void *(*)(void *))eina_list_free; eddc.func.list_free = eina_list_free;
eddc.func.hash_foreach = (void (*)(void *, int (*) (void *, const char *, void *, void *), void *))evas_hash_foreach; eddc.func.hash_foreach = eina_hash_foreach;
eddc.func.hash_add = (void *(*)(void *, const char *, void *))evas_hash_add; eddc.func.hash_add = _edje_eina_hash_add_alloc;
eddc.func.hash_free = (void (*)(void *))evas_hash_free; eddc.func.hash_free = eina_hash_free;
eddc.func.str_direct_alloc = _edje_edit_str_direct_alloc; eddc.func.str_direct_alloc = _edje_edit_str_direct_alloc;
eddc.func.str_direct_free = _edje_edit_str_direct_free; eddc.func.str_direct_free = _edje_edit_str_direct_free;

View File

@ -855,6 +855,11 @@ _edje_file_free(Edje_File *edf)
} }
free(edf->font_dir); free(edf->font_dir);
} }
if (edf->font_hash)
{
eina_hash_free(edf->font_hash);
edf->font_hash = NULL;
}
if (edf->image_dir) if (edf->image_dir)
{ {
while (edf->image_dir->entries) while (edf->image_dir->entries)

View File

@ -255,10 +255,10 @@ struct _Edje_File
int version; int version;
int feature_ver; int feature_ver;
Evas_Hash *collection_hash; Eina_Hash *collection_hash;
Evas_Hash *font_hash; Eina_Hash *font_hash;
Eina_List *collection_cache; Eina_List *collection_cache;
Evas_Hash *data_cache; Eina_Hash *data_cache;
Eet_File *ef; Eet_File *ef;
@ -433,8 +433,8 @@ struct _Edje_Part_Collection
int references; int references;
#ifdef EDJE_PROGRAM_CACHE #ifdef EDJE_PROGRAM_CACHE
struct { struct {
Evas_Hash *no_matches; Eina_Hash *no_matches;
Evas_Hash *matches; Eina_Hash *matches;
} prog_cache; } prog_cache;
#endif #endif
@ -880,7 +880,7 @@ struct _Edje_Var_List
struct _Edje_Var_Hash struct _Edje_Var_Hash
{ {
Evas_Hash *v; Eina_Hash *v;
}; };
struct _Edje_Var_Timer struct _Edje_Var_Timer

View File

@ -933,11 +933,11 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src)
Eina_List *l; Eina_List *l;
Edje_Program *pr; Edje_Program *pr;
if (evas_hash_find(ec->prog_cache.no_matches, tmps)) if (eina_hash_find(ec->prog_cache.no_matches, tmps))
{ {
done = 1; done = 1;
} }
else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps))) else if ((matches = eina_hash_find(ec->prog_cache.matches, tmps)))
{ {
EINA_LIST_FOREACH(matches, l, pr) EINA_LIST_FOREACH(matches, l, pr)
{ {
@ -988,11 +988,17 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src)
if (tmps) if (tmps)
{ {
if (data.matched == 0) if (data.matched == 0)
ec->prog_cache.no_matches = {
evas_hash_add(ec->prog_cache.no_matches, tmps, ed); if (!ec->prog_cache.no_matches)
ec->prog_cache.no_matches = eina_hash_string_superfast_new(NULL);
eina_hash_add(ec->prog_cache.no_matches, tmps, ed);
}
else else
ec->prog_cache.matches = {
evas_hash_add(ec->prog_cache.matches, tmps, data.matches); if (!ec->prog_cache.matches)
ec->prog_cache.matches = eina_hash_string_superfast_new(NULL);
eina_hash_add(ec->prog_cache.matches, tmps, data.matches);
}
} }
#endif #endif
} }

View File

@ -359,7 +359,7 @@ _edje_text_recalc_apply(Edje *ed, Edje_Real_Part *ep,
/* check if the font is embedded in the .eet */ /* check if the font is embedded in the .eet */
if (ed->file->font_hash) if (ed->file->font_hash)
{ {
Edje_Font_Directory_Entry *fnt = evas_hash_find(ed->file->font_hash, font); Edje_Font_Directory_Entry *fnt = eina_hash_find(ed->file->font_hash, font);
if (fnt) if (fnt)
{ {

View File

@ -20,11 +20,11 @@ struct _Edje_Box_Layout
typedef struct _Edje_Box_Layout Edje_Box_Layout; typedef struct _Edje_Box_Layout Edje_Box_Layout;
static Eina_Hash *_edje_color_class_hash = NULL; static Evas_Hash *_edje_color_class_hash = NULL;
static Eina_Hash *_edje_color_class_member_hash = NULL; static Evas_Hash *_edje_color_class_member_hash = NULL;
static Eina_Hash *_edje_text_class_hash = NULL; static Evas_Hash *_edje_text_class_hash = NULL;
static Eina_Hash *_edje_text_class_member_hash = NULL; static Evas_Hash *_edje_text_class_member_hash = NULL;
static Eina_Rbtree *_edje_box_layout_registry = NULL; static Eina_Rbtree *_edje_box_layout_registry = NULL;
@ -40,8 +40,8 @@ struct _Edje_List_Foreach_Data
Eina_List *list; Eina_List *list;
}; };
static Eina_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata); static Evas_Bool _edje_color_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
static Eina_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata); static Evas_Bool _edje_text_class_list_foreach(const Eina_Hash *hash, const void *key, void *data, void *fdata);
Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path); Edje_Real_Part *_edje_real_part_recursive_get_helper(Edje *ed, char **path);