raster pushed a commit to branch efl-1.22.

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

commit c4cec763a731bd4022369f52df6db7aeaae29a84
Author: Carsten Haitzler (Rasterman) <[email protected]>
Date:   Fri Jun 14 20:39:39 2019 +0100

    edje messages - make it use inlist to fragment ram less
    
    using regular lists means we double our indirect ptr jumps and
    fragment ram more - this is step one in improving performance of
    message handling in some nasty corner cases i have found. first this
    so it can be identified as an issue on its own if it is one. i've
    tested it and it seems ok. so this si stage 1.
---
 src/lib/edje/edje_message_queue.c | 110 +++++++++++++++++++++-----------------
 src/lib/edje/edje_private.h       |   7 +--
 2 files changed, 65 insertions(+), 52 deletions(-)

diff --git a/src/lib/edje/edje_message_queue.c 
b/src/lib/edje/edje_message_queue.c
index b7ecdf3e95..cb424c3de3 100644
--- a/src/lib/edje/edje_message_queue.c
+++ b/src/lib/edje/edje_message_queue.c
@@ -6,8 +6,8 @@ static int _injob = 0;
 static Ecore_Job *_job = NULL;
 static Ecore_Timer *_job_loss_timer = NULL;
 
-static Eina_List *msgq = NULL;
-static Eina_List *tmp_msgq = NULL;
+static Eina_Inlist *msgq = NULL;
+static Eina_Inlist *tmp_msgq = NULL;
 static int tmp_msgq_processing = 0;
 static int tmp_msgq_restart = 0;
 
@@ -141,35 +141,47 @@ bad_type:
    return;
 }
 
+#define INLIST_CONTAINER(container_type, list, list_entry) \
+   (container_type *)((unsigned char *)list - offsetof(container_type, 
list_entry))
+
 static void
 _edje_object_message_signal_process_do(Eo *obj EINA_UNUSED, Edje *ed)
 {
-   Eina_List *l, *ln, *tmpq = NULL;
+   Eina_Inlist *l, *ln;
+   Eina_Inlist *tmpq = NULL;
    Edje *lookup_ed;
-   Eina_List *lg;
+   Eina_List *groups = NULL, *lg;
    Edje_Message *em;
-   Eina_List *groups = NULL;
    int gotos = 0;
 
    if (!ed) return;
 
    groups = ed->groups;
 
-   EINA_LIST_FOREACH_SAFE(msgq, l, ln, em)
+   for (l = msgq; l; l = ln)
      {
+        ln = l->next;
+        em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
         EINA_LIST_FOREACH(groups, lg, lookup_ed)
-          if (em->edje == lookup_ed)
-            {
-               tmpq = eina_list_append(tmpq, em);
-               msgq = eina_list_remove_list(msgq, l);
-               break;
-            }
+          {
+             if (em->edje == lookup_ed)
+               {
+                  msgq = eina_inlist_remove(msgq, &(em->inlist_main));
+                  tmpq = eina_inlist_append(tmpq, &(em->inlist_main));
+                  break;
+               }
+          }
      }
    /* a temporary message queue */
    if (tmp_msgq)
      {
-        EINA_LIST_FREE(tmpq, em)
-          tmp_msgq = eina_list_append(tmp_msgq, em);
+        while (tmpq)
+          {
+             l = tmpq;
+             em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
+             tmpq = eina_inlist_remove(tmpq, &(em->inlist_main));
+             tmp_msgq = eina_inlist_append(tmp_msgq, &(em->inlist_main));
+          }
      }
    else
      {
@@ -179,13 +191,16 @@ _edje_object_message_signal_process_do(Eo *obj 
EINA_UNUSED, Edje *ed)
 
    tmp_msgq_processing++;
 again:
-   EINA_LIST_FOREACH_SAFE(tmp_msgq, l, ln, em)
+   for (l = tmp_msgq; l; l = ln)
      {
+        ln = l->next;
+        em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
         EINA_LIST_FOREACH(groups, lg, lookup_ed)
-          if (em->edje == lookup_ed)
-            break;
+          {
+             if (em->edje == lookup_ed) break;
+          }
         if (em->edje != lookup_ed) continue;
-        tmp_msgq = eina_list_remove_list(tmp_msgq, l);
+        tmp_msgq = eina_inlist_remove(tmp_msgq, &(em->inlist_main));
         if (!lookup_ed->delete_me)
           {
              lookup_ed->processing_messages++;
@@ -635,7 +650,7 @@ _edje_message_propagate_send(Edje *ed, Edje_Queue queue, 
Edje_Message_Type type,
      }
 
    em->msg = msg;
-   msgq = eina_list_append(msgq, em);
+   msgq = eina_inlist_append(msgq, &(em->inlist_main));
 }
 
 void
@@ -848,6 +863,7 @@ void
 _edje_message_queue_process(void)
 {
    int i;
+   Edje_Message *em;
 
    if (!msgq) return;
 
@@ -860,8 +876,11 @@ _edje_message_queue_process(void)
           {
              while (msgq)
                {
-                  tmp_msgq = eina_list_append(tmp_msgq, msgq->data);
-                  msgq = eina_list_remove_list(msgq, msgq);
+                  Eina_Inlist *l = msgq;
+
+                  em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
+                  msgq = eina_inlist_remove(msgq, &(em->inlist_main));
+                  tmp_msgq = eina_inlist_append(tmp_msgq, &(em->inlist_main));
                }
           }
         else
@@ -873,12 +892,12 @@ _edje_message_queue_process(void)
         tmp_msgq_processing++;
         while (tmp_msgq)
           {
-             Edje_Message *em;
+             Eina_Inlist *l = tmp_msgq;
              Edje *ed;
 
-             em = tmp_msgq->data;
+             em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
              ed = em->edje;
-             tmp_msgq = eina_list_remove_list(tmp_msgq, tmp_msgq);
+             tmp_msgq = eina_inlist_remove(tmp_msgq, &(em->inlist_main));
              em->edje->message.num--;
              if (!ed->delete_me)
                {
@@ -924,21 +943,21 @@ _edje_message_queue_process(void)
 void
 _edje_message_queue_clear(void)
 {
+   Edje_Message *em;
+
    while (msgq)
      {
-        Edje_Message *em;
-
-        em = msgq->data;
-        msgq = eina_list_remove_list(msgq, msgq);
+        Eina_Inlist *l = msgq;
+        em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
+        msgq = eina_inlist_remove(msgq, &(em->inlist_main));
         em->edje->message.num--;
         _edje_message_free(em);
      }
    while (tmp_msgq)
      {
-        Edje_Message *em;
-
-        em = tmp_msgq->data;
-        tmp_msgq = eina_list_remove_list(tmp_msgq, tmp_msgq);
+        Eina_Inlist *l = tmp_msgq;
+        em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
+        tmp_msgq = eina_inlist_remove(tmp_msgq, &(em->inlist_main));
         em->edje->message.num--;
         _edje_message_free(em);
      }
@@ -947,38 +966,31 @@ _edje_message_queue_clear(void)
 void
 _edje_message_del(Edje *ed)
 {
-   Eina_List *l;
+   Eina_Inlist *l, *ln;
+   Edje_Message *em;
 
    if (ed->message.num <= 0) return;
    /* delete any messages on the main queue for this edje object */
-   for (l = msgq; l; )
+   for (l = msgq; l; l = ln)
      {
-        Edje_Message *em;
-        Eina_List *lp;
-
-        em = eina_list_data_get(l);
-        lp = l;
-        l = eina_list_next(l);
+        ln = l->next;
+        em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
         if (em->edje == ed)
           {
-             msgq = eina_list_remove_list(msgq, lp);
+             msgq = eina_inlist_remove(msgq, &(em->inlist_main));
              em->edje->message.num--;
              _edje_message_free(em);
           }
         if (ed->message.num <= 0) return;
      }
    /* delete any on the processing queue */
-   for (l = tmp_msgq; l; )
+   for (l = tmp_msgq; l; l = ln)
      {
-        Edje_Message *em;
-        Eina_List *lp;
-
-        em = eina_list_data_get(l);
-        lp = l;
-        l = eina_list_next(l);
+        ln = l->next;
+        em = INLIST_CONTAINER(Edje_Message, l, inlist_main);
         if (em->edje == ed)
           {
-             tmp_msgq = eina_list_remove_list(tmp_msgq, lp);
+             tmp_msgq = eina_inlist_remove(tmp_msgq, &(em->inlist_main));
              em->edje->message.num--;
              _edje_message_free(em);
           }
diff --git a/src/lib/edje/edje_private.h b/src/lib/edje/edje_private.h
index 6ae592680f..d1bc640ac4 100644
--- a/src/lib/edje/edje_private.h
+++ b/src/lib/edje/edje_private.h
@@ -2224,12 +2224,13 @@ struct _Edje_Message_Signal
 
 struct _Edje_Message
 {
+   Eina_Inlist        inlist_main; // msgq or tmp_msgq - mut exclusive
    Edje              *edje;
-   Edje_Queue         queue;
-   Edje_Message_Type  type;
-   int                id;
    unsigned char     *msg;
+   int                id;
    Eina_Bool          propagated : 1;
+   Edje_Queue         queue      : 2;
+   Edje_Message_Type  type       : 29;
 };
 
 typedef enum _Edje_Fill

-- 


Reply via email to