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

Reply via email to