From f212675a33193d4f91afe52da69831baaa989470 Mon Sep 17 00:00:00 2001 From: Carsten Haitzler Date: Sun, 20 Jul 2003 02:08:47 +0000 Subject: [PATCH] optimizing. Glassy's matrix.eet works MUCH faster now. basically edje was not very efficient at matching hundreds of prgorams up to lots of signals always ticking off. i've optimized it now with a match (and no_match) cache so if an input signal (and source) combination is known not to match anything, it's cached after the first full check and henceforth avoids extra checks. the cache is realyl simply right now - i could optimize it a bit to avoid excess memory usage though... SVN revision: 7189 --- legacy/edje/src/bin/Makefile.am | 2 +- legacy/edje/src/bin/edje_main.c | 6 ++- legacy/edje/src/lib/edje_load.c | 84 +++++++++++++++++++++++++++++- legacy/edje/src/lib/edje_private.h | 5 ++ legacy/edje/src/lib/edje_program.c | 76 +++++++++++++++++++++++---- 5 files changed, 159 insertions(+), 14 deletions(-) diff --git a/legacy/edje/src/bin/Makefile.am b/legacy/edje/src/bin/Makefile.am index 215dbdbadb..d5065a0f81 100644 --- a/legacy/edje/src/bin/Makefile.am +++ b/legacy/edje/src/bin/Makefile.am @@ -21,7 +21,7 @@ edje_LDADD = \ $(top_builddir)/src/lib/libedje.la \ @imlib2_libs@ -edje_LDFLAGS = +edje_LDFLAGS = -static edje_DEPENDENCIES = $(top_builddir)/src/lib/libedje.la diff --git a/legacy/edje/src/bin/edje_main.c b/legacy/edje/src/bin/edje_main.c index e1a36b8043..7df140a071 100644 --- a/legacy/edje/src/bin/edje_main.c +++ b/legacy/edje/src/bin/edje_main.c @@ -331,8 +331,10 @@ bottom_move_cb(void *data, Evas *e, Evas_Object *obj, void *event_info) y -= 20; w += 20; h += 30; - minw = 20 + de->minw; - minh = 30 + de->minh; +// minw = 20 + de->minw; +// minh = 30 + de->minh; + minw = 20; + minh = 30; if (hdir > 0) { w += ev->cur.canvas.x - ev->prev.canvas.x; diff --git a/legacy/edje/src/lib/edje_load.c b/legacy/edje/src/lib/edje_load.c index 88eef90e6f..ecd5e87805 100644 --- a/legacy/edje/src/lib/edje_load.c +++ b/legacy/edje/src/lib/edje_load.c @@ -3,6 +3,9 @@ static Evas_Hash *_edje_file_hash = NULL; +static void _edje_collection_free_part_description_free(Edje_Part_Description *desc); +static int _edje_collection_free_prog_cache_matches_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata); + /* API Routines */ void edje_object_file_set(Evas_Object *obj, const char *file, const char *part) @@ -158,6 +161,15 @@ _edje_file_add(Edje *ed) ed->file = NULL; goto out; } + { + for (l = ed->file->collection_dir->entries; l; l = l->next) + { + Edje_Part_Collection_Directory_Entry *ce; + + ce = l->data; + printf("Collection: %s\n", ce->entry); + } + } _edje_file_hash = evas_hash_add(_edje_file_hash, ed->path, ed->file); } @@ -305,5 +317,75 @@ _edje_file_free(Edje_File *edf) void _edje_collection_free(Edje_Part_Collection *ec) { - printf("FIXME: leak Edje_Part_Collection!\n"); + while (ec->programs) + { + Edje_Program *pr; + + pr = ec->programs->data; + ec->programs = evas_list_remove(ec->programs, pr); + if (pr->name) free(pr->name); + if (pr->signal) free(pr->signal); + if (pr->source) free(pr->source); + if (pr->state) free(pr->state); + if (pr->state2) free(pr->state2); + while (pr->targets) + { + Edje_Program_Target *prt; + + prt = pr->targets->data; + pr->targets = evas_list_remove(pr->targets, prt); + free(prt); + } + free(pr); + } + while (ec->parts) + { + Edje_Part *ep; + + ep = ec->parts->data; + ec->parts = evas_list_remove(ec->parts, ep); + if (ep->name) free(ep->name); + if (ep->color_class) free(ep->color_class); + if (ep->text_class) free(ep->text_class); + if (ep->default_desc) _edje_collection_free_part_description_free(ep->default_desc); + while (ep->other_desc) + { + Edje_Part_Description *desc; + + desc = ep->other_desc->data; + ep->other_desc = evas_list_remove(ep->other_desc, desc); + _edje_collection_free_part_description_free(desc); + } + } + if (ec->prog_cache.no_matches) evas_hash_free(ec->prog_cache.no_matches); + if (ec->prog_cache.matches) + { + evas_hash_foreach(ec->prog_cache.matches, _edje_collection_free_prog_cache_matches_free_cb, NULL); + evas_hash_free(ec->prog_cache.matches); + } + free(ec); +} + +static void +_edje_collection_free_part_description_free(Edje_Part_Description *desc) +{ + if (desc->state.name) free(desc->state.name); + while (desc->image.tween_list) + { + Edje_Part_Image_Id *pi; + + pi = desc->image.tween_list->data; + desc->image.tween_list = evas_list_remove(desc->image.tween_list, pi); + free(pi); + } + if (desc->text.text) free(desc->text.text); + if (desc->text.font) free(desc->text.font); + free(desc); +} + +static int +_edje_collection_free_prog_cache_matches_free_cb(Evas_Hash *hash, const char *key, void *data, void *fdata) +{ + evas_list_free((Evas_List *)data); + return 1; } diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index 1c173d5376..23a895a62a 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -183,6 +183,10 @@ struct _Edje_Part_Collection int id; /* the collection id */ int references; + struct { + Evas_Hash *no_matches; + Evas_Hash *matches; + } prog_cache; }; struct _Edje_Part @@ -343,6 +347,7 @@ struct _Edje Evas_List *text_classes; int freeze; int references; + }; struct _Edje_Real_Part diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index a65d23bd13..656bf650bd 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -442,7 +442,7 @@ _edje_emit(Edje *ed, char *sig, char *src) recursions++; _edje_ref(ed); _edje_freeze(ed); - printf("EMIT \"%s\" \"%s\"\n", sig, src); +// printf("EMIT \"%s\" \"%s\"\n", sig, src); ee = calloc(1, sizeof(Edje_Emission)); if (!ee) { @@ -469,17 +469,73 @@ _edje_emit(Edje *ed, char *sig, char *src) emissions = evas_list_remove(emissions, ee); if (ed->collection) { - for (l = ed->collection->programs; l; l = l->next) + Edje_Part_Collection *ec; + char *tmps; + int l1, l2; + int done; + + ec = ed->collection; + l1 = strlen(ee->signal); + l2 = strlen(ee->source); + tmps = malloc(l1 + l2 + 2); + + if (tmps) { - Edje_Program *pr; - - pr = l->data; - if ((pr->signal) && - (pr->source) && - (_edje_glob_match(ee->signal, pr->signal)) && - (_edje_glob_match(ee->source, pr->source))) - _edje_program_run(ed, pr, 0); + strcpy(tmps, ee->signal); + tmps[l1] = '\377'; + strcpy(&(tmps[l1 + 1]), ee->source); } + done = 0; + + if (tmps) + { + Evas_List *matches; + + if (evas_hash_find(ec->prog_cache.no_matches, tmps)) + done = 1; + else if ((matches = evas_hash_find(ec->prog_cache.matches, tmps))) + { + for (l = matches; l; l = l->next) + { + Edje_Program *pr; + + pr = l->data; + _edje_program_run(ed, pr, 0); + } + done = 1; + } + } + if (!done) + { + int matched = 0; + Evas_List *matches = NULL; + + for (l = ed->collection->programs; l; l = l->next) + { + Edje_Program *pr; + + pr = l->data; + if ((pr->signal) && + (pr->source) && + (_edje_glob_match(ee->signal, pr->signal)) && + (_edje_glob_match(ee->source, pr->source))) + { + matched++; + _edje_program_run(ed, pr, 0); + matches = evas_list_append(matches, pr); + } + } + if (tmps) + { + if (matched == 0) + ec->prog_cache.no_matches = + evas_hash_add(ec->prog_cache.no_matches, tmps, ed); + else + ec->prog_cache.matches = + evas_hash_add(ec->prog_cache.matches, tmps, matches); + } + } + if (tmps) free(tmps); ed->walking_callbacks = 1; for (l = ed->callbacks; l; l = l->next) {