raster pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6139c7a3c6c8e2805e94ed851a0aabac4c24752c

commit 6139c7a3c6c8e2805e94ed851a0aabac4c24752c
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Sun Aug 21 11:14:28 2016 +0900

    edje - reduce anothr 400k or so of memory usage (esp hello world)
    
    so edje was allocating 32 pointers per collection. this is per
    collection inside an edje file even if we just use one collection from
    that edje file. it consumes 32 pointers. on 64bit thats 256 bytes...
    just for pointers to mempools so we can "optimize" freeing and
    allocation of parts. this was simply rediculous. i moved it to a
    sub-struct allocated on demand (so now only for collections we
    actually use) and this nuked 400k of "base memory usage youcant get
    rid of).
    
    note that our current default theme has something like 1100 or so
    images, 1500 or so collections in it. as theme gorws, memory footprint
    goes up if we dont allocation only on demand (when needed/used) and we
    aren't careful about the size of our data structs and their content.
    
    @optimize
---
 src/lib/edje/edje_cache.c   | 102 +++++++++++++++++++++++---------------------
 src/lib/edje/edje_calc.c    |  12 +++---
 src/lib/edje/edje_edit.c    |  24 +++++------
 src/lib/edje/edje_load.c    |   8 ++--
 src/lib/edje/edje_private.h |  29 ++++++++-----
 5 files changed, 94 insertions(+), 81 deletions(-)

diff --git a/src/lib/edje/edje_cache.c b/src/lib/edje/edje_cache.c
index 42ed166..ff6d0a7 100644
--- a/src/lib/edje/edje_cache.c
+++ b/src/lib/edje/edje_cache.c
@@ -9,18 +9,22 @@ static int _edje_collection_cache_size = 16;
 
 EAPI void
 edje_cache_emp_alloc(Edje_Part_Collection_Directory_Entry *ce)
-{  /* Init Eina Mempools this is also used in edje_pick.c */
-  char *buffer;
-#define INIT_EMP(Tp, Sz, Ce)                                                   
     \
-  buffer = alloca(strlen(ce->entry) + strlen(#Tp) + 2);                        
     \
-  sprintf(buffer, "%s/%s", ce->entry, #Tp);                                    
     \
-  Ce->mp.Tp = eina_mempool_add("one_big", buffer, NULL, sizeof (Sz), 
Ce->count.Tp); \
-  _emp_##Tp = Ce->mp.Tp;
-
-#define INIT_EMP_BOTH(Tp, Sz, Ce)                           \
-  INIT_EMP(Tp, Sz, Ce)                                      \
-  Ce->mp_rtl.Tp = eina_mempool_add("one_big", buffer, NULL, \
-                                   sizeof (Sz), Ce->count.Tp);
+{
+   /* Init Eina Mempools this is also used in edje_pick.c */
+   char *buffer;
+   ce->mp = calloc(1, sizeof(Edje_Part_Collection_Directory_Entry_Mp));
+   if (!ce->mp) return;
+
+#define INIT_EMP(Tp, Sz, Ce) \
+  buffer = alloca(strlen(ce->entry) + strlen(#Tp) + 2); \
+  sprintf(buffer, "%s/%s", ce->entry, #Tp); \
+  Ce->mp->mp.Tp = eina_mempool_add("one_big", buffer, NULL, sizeof (Sz), 
Ce->count.Tp); \
+  _emp_##Tp = Ce->mp->mp.Tp;
+
+#define INIT_EMP_BOTH(Tp, Sz, Ce) \
+  INIT_EMP(Tp, Sz, Ce) \
+  Ce->mp->mp_rtl.Tp = eina_mempool_add("one_big", buffer, NULL, \
+                                       sizeof(Sz), Ce->count.Tp);
 
   INIT_EMP_BOTH(RECTANGLE, Edje_Part_Description_Common, ce);
   INIT_EMP_BOTH(TEXT, Edje_Part_Description_Text, ce);
@@ -45,42 +49,44 @@ EAPI void
 edje_cache_emp_free(Edje_Part_Collection_Directory_Entry *ce)
 {  /* Free Eina Mempools this is also used in edje_pick.c */
    /* Destroy all part and description. */
-  eina_mempool_del(ce->mp.RECTANGLE);
-  eina_mempool_del(ce->mp.TEXT);
-  eina_mempool_del(ce->mp.IMAGE);
-  eina_mempool_del(ce->mp.PROXY);
-  eina_mempool_del(ce->mp.SWALLOW);
-  eina_mempool_del(ce->mp.TEXTBLOCK);
-  eina_mempool_del(ce->mp.GROUP);
-  eina_mempool_del(ce->mp.BOX);
-  eina_mempool_del(ce->mp.TABLE);
-  eina_mempool_del(ce->mp.EXTERNAL);
-  eina_mempool_del(ce->mp.SPACER);
-  eina_mempool_del(ce->mp.SNAPSHOT);
-  eina_mempool_del(ce->mp.MESH_NODE);
-  eina_mempool_del(ce->mp.LIGHT);
-  eina_mempool_del(ce->mp.CAMERA);
-  eina_mempool_del(ce->mp.VECTOR);
-  eina_mempool_del(ce->mp.part);
-  memset(&ce->mp, 0, sizeof (ce->mp));
-
-  eina_mempool_del(ce->mp_rtl.RECTANGLE);
-  eina_mempool_del(ce->mp_rtl.TEXT);
-  eina_mempool_del(ce->mp_rtl.IMAGE);
-  eina_mempool_del(ce->mp_rtl.PROXY);
-  eina_mempool_del(ce->mp_rtl.SWALLOW);
-  eina_mempool_del(ce->mp_rtl.TEXTBLOCK);
-  eina_mempool_del(ce->mp_rtl.GROUP);
-  eina_mempool_del(ce->mp_rtl.BOX);
-  eina_mempool_del(ce->mp_rtl.TABLE);
-  eina_mempool_del(ce->mp_rtl.EXTERNAL);
-  eina_mempool_del(ce->mp_rtl.SPACER);
-  eina_mempool_del(ce->mp_rtl.SNAPSHOT);
-  eina_mempool_del(ce->mp_rtl.MESH_NODE);
-  eina_mempool_del(ce->mp_rtl.LIGHT);
-  eina_mempool_del(ce->mp_rtl.CAMERA);
-  memset(&ce->mp_rtl, 0, sizeof (ce->mp_rtl));
-  ce->ref = NULL;
+   ce->ref = NULL;
+
+   if (!ce->mp) return;
+   eina_mempool_del(ce->mp->mp.RECTANGLE);
+   eina_mempool_del(ce->mp->mp.TEXT);
+   eina_mempool_del(ce->mp->mp.IMAGE);
+   eina_mempool_del(ce->mp->mp.PROXY);
+   eina_mempool_del(ce->mp->mp.SWALLOW);
+   eina_mempool_del(ce->mp->mp.TEXTBLOCK);
+   eina_mempool_del(ce->mp->mp.GROUP);
+   eina_mempool_del(ce->mp->mp.BOX);
+   eina_mempool_del(ce->mp->mp.TABLE);
+   eina_mempool_del(ce->mp->mp.EXTERNAL);
+   eina_mempool_del(ce->mp->mp.SPACER);
+   eina_mempool_del(ce->mp->mp.SNAPSHOT);
+   eina_mempool_del(ce->mp->mp.MESH_NODE);
+   eina_mempool_del(ce->mp->mp.LIGHT);
+   eina_mempool_del(ce->mp->mp.CAMERA);
+   eina_mempool_del(ce->mp->mp.VECTOR);
+   eina_mempool_del(ce->mp->mp.part);
+   memset(&ce->mp->mp, 0, sizeof(ce->mp->mp));
+
+   eina_mempool_del(ce->mp->mp_rtl.RECTANGLE);
+   eina_mempool_del(ce->mp->mp_rtl.TEXT);
+   eina_mempool_del(ce->mp->mp_rtl.IMAGE);
+   eina_mempool_del(ce->mp->mp_rtl.PROXY);
+   eina_mempool_del(ce->mp->mp_rtl.SWALLOW);
+   eina_mempool_del(ce->mp->mp_rtl.TEXTBLOCK);
+   eina_mempool_del(ce->mp->mp_rtl.GROUP);
+   eina_mempool_del(ce->mp->mp_rtl.BOX);
+   eina_mempool_del(ce->mp->mp_rtl.TABLE);
+   eina_mempool_del(ce->mp->mp_rtl.EXTERNAL);
+   eina_mempool_del(ce->mp->mp_rtl.SPACER);
+   eina_mempool_del(ce->mp->mp_rtl.SNAPSHOT);
+   eina_mempool_del(ce->mp->mp_rtl.MESH_NODE);
+   eina_mempool_del(ce->mp->mp_rtl.LIGHT);
+   eina_mempool_del(ce->mp->mp_rtl.CAMERA);
+   memset(&ce->mp->mp_rtl, 0, sizeof(ce->mp->mp_rtl));
 }
 
 void
diff --git a/src/lib/edje/edje_calc.c b/src/lib/edje/edje_calc.c
index c5e07c1..d7c738e 100644
--- a/src/lib/edje/edje_calc.c
+++ b/src/lib/edje/edje_calc.c
@@ -381,7 +381,7 @@ _edje_get_description_by_orientation(Edje *ed, 
Edje_Part_Description_Common *src
 case EDJE_PART_TYPE_##Short:                                          \
 {                                                                     \
    Edje_Part_Description_##Type * Name;                               \
-   Name = eina_mempool_malloc(ce->mp_rtl.Short,                       \
+   Name = eina_mempool_malloc(ce->mp->mp_rtl.Short,                   \
                               sizeof (Edje_Part_Description_##Type)); \
    desc_rtl = &Name->common;                                          \
    memsize = sizeof(Edje_Part_Description_##Type);                    \
@@ -393,35 +393,35 @@ case EDJE_PART_TYPE_##Short:                              
            \
    switch (type)
      {
       case EDJE_PART_TYPE_RECTANGLE:
-        desc_rtl = eina_mempool_malloc(ce->mp_rtl.RECTANGLE,
+        desc_rtl = eina_mempool_malloc(ce->mp->mp_rtl.RECTANGLE,
                                        sizeof (Edje_Part_Description_Common));
         ce->count.RECTANGLE++;
         memsize = sizeof(Edje_Part_Description_Common);
         break;
 
       case EDJE_PART_TYPE_SNAPSHOT:
-        desc_rtl = eina_mempool_malloc(ce->mp_rtl.SNAPSHOT,
+        desc_rtl = eina_mempool_malloc(ce->mp->mp_rtl.SNAPSHOT,
                                        sizeof 
(Edje_Part_Description_Snapshot));
         ce->count.SNAPSHOT++;
         memsize = sizeof(Edje_Part_Description_Snapshot);
         break;
 
       case EDJE_PART_TYPE_SWALLOW:
-        desc_rtl = eina_mempool_malloc(ce->mp_rtl.SWALLOW,
+        desc_rtl = eina_mempool_malloc(ce->mp->mp_rtl.SWALLOW,
                                        sizeof (Edje_Part_Description_Common));
         ce->count.SWALLOW++;
         memsize = sizeof(Edje_Part_Description_Common);
         break;
 
       case EDJE_PART_TYPE_GROUP:
-        desc_rtl = eina_mempool_malloc(ce->mp_rtl.GROUP,
+        desc_rtl = eina_mempool_malloc(ce->mp->mp_rtl.GROUP,
                                        sizeof (Edje_Part_Description_Common));
         ce->count.GROUP++;
         memsize = sizeof(Edje_Part_Description_Common);
         break;
 
       case EDJE_PART_TYPE_SPACER:
-        desc_rtl = eina_mempool_malloc(ce->mp_rtl.SPACER,
+        desc_rtl = eina_mempool_malloc(ce->mp->mp_rtl.SPACER,
                                        sizeof (Edje_Part_Description_Common));
         ce->count.SPACER++;
         memsize = sizeof(Edje_Part_Description_Common);
diff --git a/src/lib/edje/edje_edit.c b/src/lib/edje/edje_edit.c
index 7077e1d..f13a1f3 100644
--- a/src/lib/edje/edje_edit.c
+++ b/src/lib/edje/edje_edit.c
@@ -1600,9 +1600,9 @@ static void
 _mempools_add(Edje_Part_Collection_Directory_Entry *de)
 {
 #define EDIT_EMN(Tp, Sz, Ce) \
-  Ce->mp.Tp = eina_mempool_add("chained_mempool", #Tp, NULL, sizeof (Sz), 8);
+  Ce->mp->mp.Tp = eina_mempool_add("chained_mempool", #Tp, NULL, sizeof (Sz), 
8);
 #define EDIT_EMNP(Tp, Sz, Ce) \
-  Ce->mp_rtl.Tp = eina_mempool_add("chained_mempool", #Tp, NULL, sizeof (Sz), 
8);
+  Ce->mp->mp_rtl.Tp = eina_mempool_add("chained_mempool", #Tp, NULL, sizeof 
(Sz), 8);
 
    EDIT_EMN(RECTANGLE, Edje_Part_Description_Common, de);
    EDIT_EMN(TEXT, Edje_Part_Description_Text, de);
@@ -3081,7 +3081,7 @@ _edje_edit_real_part_add(Evas_Object *obj, const char 
*name, Edje_Part_Type type
    ce = eina_hash_find(ed->file->collection, ed->group);
 
    /* Alloc Edje_Part or return */
-   ep = eina_mempool_malloc(ce->mp.part, sizeof(Edje_Part));
+   ep = eina_mempool_malloc(ce->mp->mp.part, sizeof(Edje_Part));
    if (!ep) return EINA_FALSE;
    memset(ep, 0, sizeof(Edje_Part));
 
@@ -3089,7 +3089,7 @@ _edje_edit_real_part_add(Evas_Object *obj, const char 
*name, Edje_Part_Type type
    rp = eina_mempool_malloc(_edje_real_part_mp, sizeof(Edje_Real_Part));
    if (!rp)
      {
-        eina_mempool_free(ce->mp.part, ep);
+        eina_mempool_free(ce->mp->mp.part, ep);
         return EINA_FALSE;
      }
    memset(rp, 0, sizeof(Edje_Real_Part));
@@ -3100,7 +3100,7 @@ _edje_edit_real_part_add(Evas_Object *obj, const char 
*name, Edje_Part_Type type
    tmp = realloc(pc->parts, (pc->parts_count + 1) * sizeof (Edje_Part *));
    if (!tmp)
      {
-        eina_mempool_free(ce->mp.part, ep);
+        eina_mempool_free(ce->mp->mp.part, ep);
         eina_mempool_free(_edje_real_part_mp, rp);
         return EINA_FALSE;
      }
@@ -3241,7 +3241,7 @@ _edje_edit_real_part_add(Evas_Object *obj, const char 
*name, Edje_Part_Type type
         _edje_if_string_free(ed, &ep->name);
         if (source)
           _edje_if_string_free(ed, &ep->source);
-        eina_mempool_free(ce->mp.part, ep);
+        eina_mempool_free(ce->mp->mp.part, ep);
         eina_mempool_free(_edje_real_part_mp, rp);
         return EINA_FALSE;
      }
@@ -3347,7 +3347,7 @@ edje_edit_part_del(Evas_Object *obj, const char *part)
      _edje_collection_free_part_description_free(ep->type, ep->other.desc[k], 
ce, 0);
 
    free(ep->other.desc);
-   eina_mempool_free(ce->mp.part, ep);
+   eina_mempool_free(ce->mp->mp.part, ep);
 
    /* Free Edje_Real_Part */
    _edje_real_part_free(ed, rp);
@@ -6197,22 +6197,22 @@ _edje_edit_state_alloc(int type, Edje *ed)
    switch (type)
      {
       case EDJE_PART_TYPE_RECTANGLE:
-        pd = eina_mempool_malloc(ce->mp.RECTANGLE, sizeof 
(Edje_Part_Description_Common));
+        pd = eina_mempool_malloc(ce->mp->mp.RECTANGLE, sizeof 
(Edje_Part_Description_Common));
         ce->count.RECTANGLE++;
         break;
 
       case EDJE_PART_TYPE_SPACER:
-        pd = eina_mempool_malloc(ce->mp.SPACER, sizeof 
(Edje_Part_Description_Common));
+        pd = eina_mempool_malloc(ce->mp->mp.SPACER, sizeof 
(Edje_Part_Description_Common));
         ce->count.SPACER++;
         break;
 
       case EDJE_PART_TYPE_SWALLOW:
-        pd = eina_mempool_malloc(ce->mp.SWALLOW, sizeof 
(Edje_Part_Description_Common));
+        pd = eina_mempool_malloc(ce->mp->mp.SWALLOW, sizeof 
(Edje_Part_Description_Common));
         ce->count.SWALLOW++;
         break;
 
       case EDJE_PART_TYPE_GROUP:
-        pd = eina_mempool_malloc(ce->mp.GROUP, sizeof 
(Edje_Part_Description_Common));
+        pd = eina_mempool_malloc(ce->mp->mp.GROUP, sizeof 
(Edje_Part_Description_Common));
         ce->count.GROUP++;
         break;
 
@@ -6221,7 +6221,7 @@ case EDJE_PART_TYPE_##Short:                              
            \
 {                                                                     \
    Edje_Part_Description_##Type * Name;                               \
                                                                       \
-   Name = eina_mempool_malloc(ce->mp.Short,                           \
+   Name = eina_mempool_malloc(ce->mp->mp.Short,                       \
                               sizeof (Edje_Part_Description_##Type)); \
    memset(Name, 0, sizeof(Edje_Part_Description_##Type));             \
    pd = &Name->common;                                                \
diff --git a/src/lib/edje/edje_load.c b/src/lib/edje/edje_load.c
index 6aca9e7..085c3c7 100644
--- a/src/lib/edje/edje_load.c
+++ b/src/lib/edje/edje_load.c
@@ -2035,7 +2035,7 @@ _edje_collection_free(Edje_File *edf, 
Edje_Part_Collection *ec, Edje_Part_Collec
         // technically need this - but we ASSUME we use "one_big" so 
everything gets
         // freed in one go lower down when we del the mempool... but what if 
pool goes
         // "over"?
-        eina_mempool_free(ce->mp.part, ep);
+        eina_mempool_free(ce->mp->mp.part, ep);
      }
    free(ec->parts);
    ec->parts = NULL;
@@ -2141,9 +2141,9 @@ _edje_collection_free_part_description_free(int type,
                                             
Edje_Part_Collection_Directory_Entry *ce,
                                             Eina_Bool free_strings)
 {
-#define FREE_POOL(Type, Ce, Desc)                                 \
-case EDJE_PART_TYPE_##Type: eina_mempool_free(Ce->mp.Type, Desc); \
-  ce->count.Type--;                                               \
+#define FREE_POOL(Type, Ce, Desc)                                     \
+case EDJE_PART_TYPE_##Type: eina_mempool_free(ce->mp->mp.Type, Desc); \
+  ce->count.Type--;                                                   \
   break;
 
    _edje_collection_free_part_description_clean(type, desc, free_strings);
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 9794736..ebb47ba 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -884,11 +884,29 @@ struct _Edje_Limit
       TYPE      SNAPSHOT;         \
       TYPE      VECTOR;
 
+typedef struct _Edje_Part_Collection_Directory_Entry_Mp 
Edje_Part_Collection_Directory_Entry_Mp;
+
+struct _Edje_Part_Collection_Directory_Entry_Mp
+{
+   struct
+   {
+      PART_TYPE_FIELDS(Eina_Mempool *)
+      Eina_Mempool *part;
+   } mp;
+
+   struct
+   {
+      PART_TYPE_FIELDS(Eina_Mempool *)
+   } mp_rtl; /* For Right To Left interface */
+};
+
 struct _Edje_Part_Collection_Directory_Entry
 {
    const char *entry; /* the nominal name of the part collection */
    Edje_Part_Collection *ref;
 
+   Edje_Part_Collection_Directory_Entry_Mp *mp;
+
    struct
    {
       PART_TYPE_FIELDS(int)
@@ -897,17 +915,6 @@ struct _Edje_Part_Collection_Directory_Entry
 
    int         id; /* the id of this named part collection */
 
-   struct
-   {
-      PART_TYPE_FIELDS(Eina_Mempool *)
-      Eina_Mempool *part;
-   } mp;
-
-   struct
-   {
-      PART_TYPE_FIELDS(Eina_Mempool *)
-   } mp_rtl; /* For Right To Left interface */
-
    Eina_Bool group_alias;
 };
 

-- 


Reply via email to