Enlightenment CVS committal Author : barbieri Project : e17 Module : libs/edje
Dir : e17/libs/edje/src/lib Modified Files: edje_load.c edje_match.c edje_private.h edje_program.c Log Message: Reduce memory allocation for edje match. Just allocate and build the match automate for callbacks and programs only when required. On load for programs and when callbacks list has been updated. Patch by Cedric BAIL. (with minor fixes to use TABS where context was using) =================================================================== RCS file: /cvs/e/e17/libs/edje/src/lib/edje_load.c,v retrieving revision 1.111 retrieving revision 1.112 diff -u -3 -r1.111 -r1.112 --- edje_load.c 18 Jan 2008 06:34:04 -0000 1.111 +++ edje_load.c 21 Feb 2008 18:48:36 -0000 1.112 @@ -410,6 +410,15 @@ rp->text.text_source = ed->table_parts[rp->param1.description->text.id_text_source % ed->table_parts_size]; } } + + if (ed->patterns.programs.signals_patterns) + { + edje_match_patterns_free(ed->patterns.programs.signals_patterns); + edje_match_patterns_free(ed->patterns.programs.sources_patterns); + } + ed->patterns.programs.signals_patterns = edje_match_programs_signal_init(ed->collection->programs); + ed->patterns.programs.sources_patterns = edje_match_programs_source_init(ed->collection->programs); + n = evas_list_count(ed->collection->programs); if (n > 0) { =================================================================== RCS file: /cvs/e/e17/libs/edje/src/lib/edje_match.c,v retrieving revision 1.1 retrieving revision 1.2 diff -u -3 -r1.1 -r1.2 --- edje_match.c 18 Jan 2008 06:34:04 -0000 1.1 +++ edje_match.c 21 Feb 2008 18:48:36 -0000 1.2 @@ -14,7 +14,6 @@ size_t pos; }; -typedef struct _Edje_States Edje_States; struct _Edje_States { size_t size; @@ -37,12 +36,13 @@ Size++; \ }; -static Edje_States* -_edje_match_states_alloc(size_t n, - size_t patterns_size, - size_t patterns_max_length) +static int +_edje_match_states_alloc(Edje_Patterns *ppat, int n) { - Edje_States *l; + Edje_States *l; + + const size_t patterns_size = ppat->patterns_size; + const size_t patterns_max_length = ppat->max_length; const size_t array_len = (patterns_max_length + 1) * patterns_size; @@ -69,8 +69,9 @@ struct_size += states_has_size; l = malloc(n * struct_size); - if (!l) return NULL; + if (!l) return 0; + ppat->states = l; states = (unsigned char *) (l + n); has = states + states_size; @@ -82,7 +83,7 @@ has += states_has_size; } - return l; + return 1; } static void @@ -295,6 +296,12 @@ lst = evas_list_next(lst); \ } \ \ + if (!_edje_match_states_alloc(r, 2)) \ + { \ + free(r); \ + return NULL; \ + } \ + \ return r; \ } @@ -451,22 +458,16 @@ edje_match_collection_dir_exec(const Edje_Patterns *ppat, const char *string) { - Edje_States *states = _edje_match_states_alloc(2, - ppat->patterns_size, - ppat->max_length); Edje_States *result; int r = 0; - if (!states) - return 0; - _edje_match_patterns_exec_init_states(states, ppat->patterns_size, ppat->max_length); + _edje_match_patterns_exec_init_states(ppat->states, ppat->patterns_size, ppat->max_length); - result = _edje_match_fn(ppat, string, states); + result = _edje_match_fn(ppat, string, ppat->states); if (result) r = _edje_match_collection_dir_exec_finals(ppat->finals, result); - _edje_match_states_free(states, 2); return r; } @@ -479,28 +480,19 @@ int (*func)(Edje_Program *pr, void *data), void *data) { - Edje_States *signal_states = _edje_match_states_alloc(2, - ppat_signal->patterns_size, - ppat_signal->max_length); - Edje_States *source_states = _edje_match_states_alloc(2, - ppat_source->patterns_size, - ppat_source->max_length); Edje_States *signal_result; Edje_States *source_result; int r = 0; - if (!signal_states || !source_states) - return 0; - - _edje_match_patterns_exec_init_states(signal_states, + _edje_match_patterns_exec_init_states(ppat_signal->states, ppat_signal->patterns_size, ppat_signal->max_length); - _edje_match_patterns_exec_init_states(source_states, + _edje_match_patterns_exec_init_states(ppat_source->states, ppat_source->patterns_size, ppat_source->max_length); - signal_result = _edje_match_fn(ppat_signal, signal, signal_states); - source_result = _edje_match_fn(ppat_source, source, source_states); + signal_result = _edje_match_fn(ppat_signal, signal, ppat_signal->states); + source_result = _edje_match_fn(ppat_source, source, ppat_source->states); if (signal_result && source_result) r = edje_match_programs_exec_check_finals(ppat_signal->finals, @@ -510,9 +502,6 @@ programs, func, data); - - _edje_match_states_free(source_states, 2); - _edje_match_states_free(signal_states, 2); return r; } @@ -524,28 +513,19 @@ Evas_List *callbacks, Edje *ed) { - Edje_States *signal_states = _edje_match_states_alloc(2, - ppat_signal->patterns_size, - ppat_signal->max_length); - Edje_States *source_states = _edje_match_states_alloc(2, - ppat_source->patterns_size, - ppat_source->max_length); Edje_States *signal_result; Edje_States *source_result; int r = 0; - if (!signal_states || !source_states) - return 0; - - _edje_match_patterns_exec_init_states(signal_states, + _edje_match_patterns_exec_init_states(ppat_signal->states, ppat_signal->patterns_size, ppat_signal->max_length); - _edje_match_patterns_exec_init_states(source_states, + _edje_match_patterns_exec_init_states(ppat_source->states, ppat_source->patterns_size, ppat_source->max_length); - signal_result = _edje_match_fn(ppat_signal, signal, signal_states); - source_result = _edje_match_fn(ppat_source, source, source_states); + signal_result = _edje_match_fn(ppat_signal, signal, ppat_signal->states); + source_result = _edje_match_fn(ppat_source, source, ppat_source->states); if (signal_result && source_result) r = edje_match_callback_exec_check_finals(ppat_signal->finals, @@ -556,15 +536,13 @@ source, callbacks, ed); - - _edje_match_states_free(source_states, 2); - _edje_match_states_free(signal_states, 2); return r; } void edje_match_patterns_free(Edje_Patterns *ppat) { + _edje_match_states_free(ppat->states, 2); free(ppat); } =================================================================== RCS file: /cvs/e/e17/libs/edje/src/lib/edje_private.h,v retrieving revision 1.137 retrieving revision 1.138 diff -u -3 -r1.137 -r1.138 --- edje_private.h 19 Jan 2008 01:00:14 -0000 1.137 +++ edje_private.h 21 Feb 2008 18:48:36 -0000 1.138 @@ -122,6 +122,7 @@ typedef struct _Edje_Part_Image_Id Edje_Part_Image_Id; typedef struct _Edje_Part_Description Edje_Part_Description; typedef struct _Edje_Spectrum_Color Edje_Spectrum_Color; +typedef struct _Edje_Patterns Edje_Patterns; #define PI 3.14159265358979323846 @@ -606,6 +607,17 @@ int table_programs_size; int table_parts_size; + struct { + struct { + Edje_Patterns *signals_patterns; + Edje_Patterns *sources_patterns; + } callbacks; + struct { + Edje_Patterns *signals_patterns; + Edje_Patterns *sources_patterns; + } programs; + } patterns; + int references; int block; int load_error; @@ -913,14 +925,16 @@ } Edje_Match_Error; -typedef struct _Edje_Patterns Edje_Patterns; +typedef struct _Edje_States Edje_States; struct _Edje_Patterns { const char **patterns; + + Edje_States *states; + size_t patterns_size; size_t max_length; size_t finals[]; - }; Edje_Patterns *edje_match_collection_dir_init(Evas_List *lst); =================================================================== RCS file: /cvs/e/e17/libs/edje/src/lib/edje_program.c,v retrieving revision 1.55 retrieving revision 1.56 diff -u -3 -r1.55 -r1.56 --- edje_program.c 18 Jan 2008 06:34:04 -0000 1.55 +++ edje_program.c 21 Feb 2008 18:48:36 -0000 1.56 @@ -5,6 +5,7 @@ #include "edje_private.h" static void _edje_emit_cb(Edje *ed, const char *sig, const char *src); +static void _edje_clean_callbacks_patterns(Edje *ed); int _edje_anim_count = 0; Ecore_Animator *_edje_timer = NULL; @@ -105,6 +106,7 @@ escb->just_added = 1; ed->just_added_callbacks = 1; } + _edje_clean_callbacks_patterns(ed); } /** Remove a callback from an object @@ -150,6 +152,8 @@ } else { + _edje_clean_callbacks_patterns(ed); + ed->callbacks = evas_list_remove_list(ed->callbacks, l); if (escb->signal) evas_stringshare_del(escb->signal); if (escb->source) evas_stringshare_del(escb->source); @@ -926,29 +930,16 @@ data.matched = 0; data.matches = NULL; #endif - Edje_Patterns *signals_patterns; - Edje_Patterns *sources_patterns; - if (ed->collection->programs) { - signals_patterns = edje_match_programs_signal_init(ed->collection->programs); - sources_patterns = edje_match_programs_source_init(ed->collection->programs); - - if (edje_match_programs_exec(signals_patterns, - sources_patterns, + if (edje_match_programs_exec(ed->patterns.programs.signals_patterns, + ed->patterns.programs.sources_patterns, sig, src, ed->collection->programs, _edje_glob_callback, &data) == 0) - { - edje_match_patterns_free(signals_patterns); - edje_match_patterns_free(sources_patterns); - goto break_prog; - } - - edje_match_patterns_free(signals_patterns); - edje_match_patterns_free(sources_patterns); + goto break_prog; } #ifdef EDJE_PROGRAM_CACHE @@ -979,8 +970,6 @@ static void _edje_emit_cb(Edje *ed, const char *sig, const char *src) { - Edje_Patterns *signals_patterns; - Edje_Patterns *sources_patterns; Evas_List *l; if (ed->delete_me) return; @@ -993,25 +982,21 @@ { int r; - signals_patterns = edje_match_callback_signal_init(ed->callbacks); - sources_patterns = edje_match_callback_source_init(ed->callbacks); + if (!ed->patterns.callbacks.signals_patterns) + { + ed->patterns.callbacks.signals_patterns = edje_match_callback_signal_init(ed->callbacks); + ed->patterns.callbacks.sources_patterns = edje_match_callback_source_init(ed->callbacks); + } - r = edje_match_callback_exec(signals_patterns, - sources_patterns, + r = edje_match_callback_exec(ed->patterns.callbacks.signals_patterns, + ed->patterns.callbacks.sources_patterns, sig, src, ed->callbacks, ed); if (!r) - { - edje_match_patterns_free(signals_patterns); - edje_match_patterns_free(sources_patterns); - goto break_prog; - } - - edje_match_patterns_free(signals_patterns); - edje_match_patterns_free(sources_patterns); + goto break_prog; } ed->walking_callbacks = 0; @@ -1030,6 +1015,8 @@ escb->just_added = 0; if (escb->delete_me) { + _edje_clean_callbacks_patterns(ed); + ed->callbacks = evas_list_remove_list(ed->callbacks, l); if (escb->signal) evas_stringshare_del(escb->signal); if (escb->source) evas_stringshare_del(escb->source); @@ -1043,3 +1030,16 @@ _edje_thaw(ed); _edje_unref(ed); } + +static void +_edje_clean_callbacks_patterns(Edje *ed) +{ + if (ed->patterns.callbacks.signals_patterns) + { + edje_match_patterns_free(ed->patterns.callbacks.signals_patterns); + edje_match_patterns_free(ed->patterns.callbacks.sources_patterns); + ed->patterns.callbacks.signals_patterns = NULL; + ed->patterns.callbacks.sources_patterns = NULL; + } +} + ------------------------------------------------------------------------- This SF.net email is sponsored by: Microsoft Defy all challenges. Microsoft(R) Visual Studio 2008. http://clk.atdmt.com/MRT/go/vse0120000070mrt/direct/01/ _______________________________________________ enlightenment-cvs mailing list enlightenment-cvs@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-cvs