diff --git a/legacy/edje/ChangeLog b/legacy/edje/ChangeLog index 45f76ab7aa..1575668475 100644 --- a/legacy/edje/ChangeLog +++ b/legacy/edje/ChangeLog @@ -615,6 +615,11 @@ 2012-09-11 Carsten Haitzler (The Rasterman) - * Improve memory footrpint by cutting core edje real part + * Improve memory footprint by cutting core edje real part struct down by less than half its size and making some parts allocated extra only if the type needs it. + +2012-09-12 Cedric Bail + + * Small improvement in memory footprint by using an array instead of a list for + some callback list. diff --git a/legacy/edje/NEWS b/legacy/edje/NEWS index d1a219f6bf..c1738050d8 100644 --- a/legacy/edje/NEWS +++ b/legacy/edje/NEWS @@ -16,6 +16,7 @@ Improvements: * O(1) lookup when generating alias of group. * O(1) access time for parameters in edje_cc_handler. * Recycle and use less memory during load time. + * Less memory used per callbacks. Fixes: diff --git a/legacy/edje/src/lib/edje_match.c b/legacy/edje/src/lib/edje_match.c index 8de66cee54..caa047d59e 100644 --- a/legacy/edje/src/lib/edje_match.c +++ b/legacy/edje/src/lib/edje_match.c @@ -750,13 +750,13 @@ edje_match_program_hash_build(Edje_Program * const *programs, item->signal = programs[i]->signal; item->source = programs[i]->source; - item->list = NULL; + eina_array_step_set(&item->list, sizeof (Eina_Array), 8); new = eina_rbtree_inline_insert(new, EINA_RBTREE_GET(item), EINA_RBTREE_CMP_NODE_CB(_edje_signal_source_node_cmp), NULL); } - item->list = eina_list_prepend(item->list, programs[i]); + eina_array_push(&item->list, programs[i]); } else result = eina_list_prepend(result, programs[i]); @@ -791,13 +791,13 @@ edje_match_callback_hash_build(const Eina_List *callbacks, item->signal = callback->signal; item->source = callback->source; - item->list = NULL; + eina_array_step_set(&item->list, sizeof (Eina_Array), 8); new = eina_rbtree_inline_insert(new, EINA_RBTREE_GET(item), EINA_RBTREE_CMP_NODE_CB(_edje_signal_source_node_cmp), NULL); } - item->list = eina_list_prepend(item->list, callback); + eina_array_push(&item->list, callback); } else result = eina_list_prepend(result, callback); @@ -807,7 +807,7 @@ edje_match_callback_hash_build(const Eina_List *callbacks, return result; } -const Eina_List * +const Eina_Array * edje_match_signal_source_hash_get(const char *sig, const char *source, const Eina_Rbtree *tree) @@ -817,13 +817,13 @@ edje_match_signal_source_hash_get(const char *sig, lookup = (Edje_Signal_Source_Char*) eina_rbtree_inline_lookup(tree, sig, 0, EINA_RBTREE_CMP_KEY_CB(_edje_signal_source_key_cmp), source); - if (lookup) return lookup->list; + if (lookup) return &lookup->list; return NULL; } void edje_match_signal_source_free(Edje_Signal_Source_Char *key, __UNUSED__ void *data) { - eina_list_free(key->list); + eina_array_flush(&key->list); free(key); } diff --git a/legacy/edje/src/lib/edje_private.h b/legacy/edje/src/lib/edje_private.h index d4cc4e4802..89687fd037 100644 --- a/legacy/edje/src/lib/edje_private.h +++ b/legacy/edje/src/lib/edje_private.h @@ -1083,7 +1083,7 @@ struct _Edje_Signal_Source_Char const char *signal; const char *source; - Eina_List *list; + Eina_Array list; }; struct _Edje_Signals_Sources_Patterns @@ -1672,9 +1672,9 @@ Eina_List *edje_match_program_hash_build(Edje_Program * const * programs, Eina_Rbtree **tree); Eina_List *edje_match_callback_hash_build(const Eina_List *callbacks, Eina_Rbtree **tree); -const Eina_List *edje_match_signal_source_hash_get(const char *signal, - const char *source, - const Eina_Rbtree *tree); +const Eina_Array *edje_match_signal_source_hash_get(const char *signal, + const char *source, + const Eina_Rbtree *tree); void edje_match_signal_source_free(Edje_Signal_Source_Char *key, void *data); // FIXME remove below 2 eapi decls when edje_convert goes diff --git a/legacy/edje/src/lib/edje_program.c b/legacy/edje/src/lib/edje_program.c index 5ad5140cef..374e30adf1 100644 --- a/legacy/edje/src/lib/edje_program.c +++ b/legacy/edje/src/lib/edje_program.c @@ -1211,9 +1211,13 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src, if (ed->table_programs_size > 0) { - const Eina_List *match; + const Eina_Array *match; +#ifdef EDJE_PROGRAM_CACHE const Eina_List *l; +#endif Edje_Program *pr; + Eina_Array_Iterator iterator; + unsigned int i; if (ed->patterns.programs.u.programs.globing) if (edje_match_programs_exec(ed->patterns.programs.signals_patterns, @@ -1228,8 +1232,9 @@ _edje_emit_handle(Edje *ed, const char *sig, const char *src, match = edje_match_signal_source_hash_get(sig, src, ed->patterns.programs.exact_match); - EINA_LIST_FOREACH(match, l, pr) - _edje_glob_callback(pr, &data); + if (match) + EINA_ARRAY_ITER_NEXT(match, i, pr, iterator) + _edje_glob_callback(pr, &data); #ifdef EDJE_PROGRAM_CACHE EINA_LIST_FOREACH(data.matches, l, pr) @@ -1307,8 +1312,9 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da if (ed->callbacks) { Edje_Signal_Callback *escb; - const Eina_List *match; - const Eina_List *l2; + const Eina_Array *match; + Eina_Array_Iterator iterator; + unsigned int i; int r = 1; callback_extra_data = (data) ? data->data : NULL; @@ -1327,16 +1333,17 @@ _edje_emit_cb(Edje *ed, const char *sig, const char *src, Edje_Message_Signal_Da match = edje_match_signal_source_hash_get(sig, src, ed->patterns.callbacks.exact_match); - EINA_LIST_FOREACH(match, l2, escb) - { - if ((prop) && (escb->propagate)) continue; - if ((!escb->just_added) && (!escb->delete_me)) - { - escb->func(escb->data, ed->obj, sig, src); - if (_edje_block_break(ed)) - break; - } - } + if (match) + EINA_ARRAY_ITER_NEXT(match, i, escb, iterator) + { + if ((prop) && (escb->propagate)) continue; + if ((!escb->just_added) && (!escb->delete_me)) + { + escb->func(escb->data, ed->obj, sig, src); + if (_edje_block_break(ed)) + break; + } + } } break_prog: