eina list - make eina list magic optional and for now turn it off
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>
Wed, 21 Aug 2019 13:24:21 +0000 (14:24 +0100)
committerWonki Kim <wonki_.kim@samsung.com>
Fri, 23 Aug 2019 08:53:47 +0000 (17:53 +0900)
this should bring our list nodes back to 32bytes (or 16 on 32bit)
which is the rounded up libc allocation size anyway expected. less mem
usage but less safety. i haven't seen any magic complainets to do with
eina list for a while now... so let's see.

src/lib/eina/eina_list.c
src/lib/eina/eina_list.h

index a5a6ba7..2e7e24c 100644 (file)
  * @cond LOCAL
  */
 
-static const char EINA_MAGIC_LIST_STR[] = "Eina List";
 static const char EINA_MAGIC_LIST_ITERATOR_STR[] = "Eina List Iterator";
 static const char EINA_MAGIC_LIST_ACCESSOR_STR[] = "Eina List Accessor";
+#ifdef EINA_LIST_MAGIC
+static const char EINA_MAGIC_LIST_STR[] = "Eina List";
 static const char EINA_MAGIC_LIST_ACCOUNTING_STR[] = "Eina List Accounting";
 
 
@@ -105,6 +106,16 @@ static const char EINA_MAGIC_LIST_ACCOUNTING_STR[] = "Eina List Accounting";
           }                                                           \
    } while(0)
 
+#define EINA_MAGIC_CHECK_LIST_ACCOUNTING(d)                     \
+   do {                                                          \
+        if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ACCOUNTING))       \
+          {                                                           \
+             EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ACCOUNTING);         \
+             return;                                                 \
+          }                                                           \
+   } while(0)
+#endif
+
 #define EINA_MAGIC_CHECK_LIST_ITERATOR(d, ...)                  \
    do {                                                          \
         if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ITERATOR))         \
@@ -123,14 +134,6 @@ static const char EINA_MAGIC_LIST_ACCOUNTING_STR[] = "Eina List Accounting";
           }                                                           \
    } while(0)
 
-#define EINA_MAGIC_CHECK_LIST_ACCOUNTING(d)                     \
-   do {                                                          \
-        if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ACCOUNTING))       \
-          {                                                           \
-             EINA_MAGIC_FAIL(d, EINA_MAGIC_LIST_ACCOUNTING);         \
-             return;                                                 \
-          }                                                           \
-   } while(0)
 
 #define EINA_LIST_SORT_STACK_SIZE 32
 
@@ -143,7 +146,6 @@ struct _Eina_Iterator_List
 
    const Eina_List *head;
    const Eina_List *current;
-
    EINA_MAGIC
 };
 
@@ -155,7 +157,6 @@ struct _Eina_Accessor_List
    const Eina_List *current;
 
    unsigned int index;
-
    EINA_MAGIC
 };
 
@@ -183,9 +184,9 @@ _eina_list_mempool_accounting_new(EINA_UNUSED Eina_List *list)
                           sizeof (Eina_List_Accounting));
    if (!tmp)
      return NULL;
-
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST_ACCOUNTING);
-
+#endif
    return tmp;
 }
 
@@ -204,9 +205,10 @@ _eina_list_list_free(void *list)
 static inline void
 _eina_list_mempool_accounting_free(Eina_List_Accounting *accounting)
 {
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST_ACCOUNTING(accounting);
-
    EINA_MAGIC_SET(accounting, EINA_MAGIC_NONE);
+#endif
    eina_freeq_ptr_main_add(accounting, _eina_list_accounting_free, sizeof(*accounting));
 }
 
@@ -218,32 +220,35 @@ _eina_list_mempool_list_new(EINA_UNUSED Eina_List *list)
    tmp = eina_mempool_malloc(_eina_list_mp, sizeof (Eina_List));
    if (!tmp)
      return NULL;
-
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST);
-
+#endif
    return tmp;
 }
 static inline void
 _eina_list_mempool_list_free(Eina_List *list)
 {
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list);
-
+#endif
    if (list->accounting)
      {
         list->accounting->count--;
         if (list->accounting->count == 0)
           _eina_list_mempool_accounting_free(list->accounting);
      }
-
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_SET(list, EINA_MAGIC_NONE);
+#endif
    eina_freeq_ptr_main_add(list, _eina_list_list_free, sizeof(*list));
 }
 
 static Eina_List *
 _eina_list_setup_accounting(Eina_List *list)
 {
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    list->accounting = _eina_list_mempool_accounting_new(list);
    if (!list->accounting)
      goto on_error;
@@ -261,9 +266,10 @@ on_error:
 static inline void
 _eina_list_update_accounting(Eina_List *list, Eina_List *new_list)
 {
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list);
    EINA_MAGIC_CHECK_LIST(new_list);
-
+#endif
    list->accounting->count++;
    new_list->accounting = list->accounting;
 }
@@ -287,7 +293,6 @@ static Eina_Bool
 eina_list_iterator_next(Eina_Iterator_List *it, void **data)
 {
    EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
-
    if (!it->current)
      return EINA_FALSE;
 
@@ -302,7 +307,6 @@ static Eina_Bool
 eina_list_iterator_prev(Eina_Iterator_List *it, void **data)
 {
    EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
-
    if (!it->current)
      return EINA_FALSE;
 
@@ -317,7 +321,6 @@ static Eina_List *
 eina_list_iterator_get_container(Eina_Iterator_List *it)
 {
    EINA_MAGIC_CHECK_LIST_ITERATOR(it, NULL);
-
    return (Eina_List *)it->head;
 }
 
@@ -325,7 +328,6 @@ static void
 eina_list_iterator_free(Eina_Iterator_List *it)
 {
    EINA_MAGIC_CHECK_LIST_ITERATOR(it);
-
    MAGIC_FREE(it);
 }
 
@@ -337,7 +339,6 @@ eina_list_accessor_get_at(Eina_Accessor_List *it, unsigned int idx, void **data)
    unsigned int i;
 
    EINA_MAGIC_CHECK_LIST_ACCESSOR(it, EINA_FALSE);
-
    if (idx >= eina_list_count(it->head))
      return EINA_FALSE;
 
@@ -395,7 +396,6 @@ static Eina_List *
 eina_list_accessor_get_container(Eina_Accessor_List *it)
 {
    EINA_MAGIC_CHECK_LIST_ACCESSOR(it, NULL);
-
    return (Eina_List *)it->head;
 }
 
@@ -403,7 +403,6 @@ static void
 eina_list_accessor_free(Eina_Accessor_List *it)
 {
    EINA_MAGIC_CHECK_LIST_ACCESSOR(it);
-
    MAGIC_FREE(it);
 }
 
@@ -413,7 +412,6 @@ eina_list_accessor_clone(Eina_Accessor_List *list)
    Eina_Accessor_List *ac;
 
    EINA_MAGIC_CHECK_LIST_ACCESSOR(list, NULL);
-
    EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL);
 
    ac = calloc(1, sizeof (Eina_Accessor_List));
@@ -429,8 +427,9 @@ eina_list_sort_rebuild_prev(Eina_List *list)
 {
    Eina_List *prev = NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    for (; list; list = list->next)
      {
         list->prev = prev;
@@ -530,10 +529,12 @@ eina_list_init(void)
      }
 
 #define EMS(n) eina_magic_string_static_set(n, n ## _STR)
+#ifdef EINA_LIST_MAGIC
    EMS(EINA_MAGIC_LIST);
+   EMS(EINA_MAGIC_LIST_ACCOUNTING);
+#endif
    EMS(EINA_MAGIC_LIST_ITERATOR);
    EMS(EINA_MAGIC_LIST_ACCESSOR);
-   EMS(EINA_MAGIC_LIST_ACCOUNTING);
 #undef EMS
 
    return EINA_TRUE;
@@ -595,8 +596,9 @@ eina_list_append(Eina_List *list, const void *data)
         return _eina_list_setup_accounting(new_l);
      }
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST_GOTO(list, on_error);
-
+#endif
    l = list->accounting->last;
    list->accounting->last = new_l;
 
@@ -605,8 +607,9 @@ eina_list_append(Eina_List *list, const void *data)
 
    _eina_list_update_accounting(list, new_l);
    return list;
-
+#ifdef EINA_LIST_MAGIC
 on_error:
+#endif
    _eina_list_mempool_list_free(new_l);
    return NULL;
 }
@@ -626,15 +629,18 @@ eina_list_prepend(Eina_List *list, const void *data)
    if (!list)
      return _eina_list_setup_accounting(new_l);
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST_GOTO(list, on_error);
-
+#endif
    list->prev = new_l;
 
    _eina_list_update_accounting(list, new_l);
 
    return new_l;
 
+#ifdef EINA_LIST_MAGIC
 on_error:
+#endif
    _eina_list_mempool_list_free(new_l);
    return NULL;
 }
@@ -647,9 +653,10 @@ eina_list_append_relative(Eina_List *list,
    Eina_List *l;
    void *list_data;
 
+#ifdef EINA_LIST_MAGIC
    if (list)
      EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    EINA_LIST_FOREACH(list, l, list_data)
      {
         if (list_data == relative)
@@ -669,7 +676,9 @@ eina_list_append_relative_list(Eina_List *list,
    if ((!list) || (!relative))
      return eina_list_append(list, data);
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(relative, NULL);
+#endif
 
    new_l = _eina_list_mempool_list_new(list);
    if (!new_l) return list;
@@ -699,9 +708,10 @@ eina_list_prepend_relative(Eina_List *list,
    Eina_List *l;
    void *list_data;
 
+#ifdef EINA_LIST_MAGIC
    if (list)
      EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    EINA_LIST_FOREACH(list, l, list_data)
      {
         if (list_data == relative)
@@ -720,8 +730,9 @@ eina_list_prepend_relative_list(Eina_List *list,
    if ((!list) || (!relative))
      return eina_list_prepend(list, data);
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(relative, NULL);
-
+#endif
    new_l = _eina_list_mempool_list_new(list);
    if (!new_l) return list;
 
@@ -763,9 +774,10 @@ eina_list_remove(Eina_List *list, const void *data)
 {
    Eina_List *l;
 
+#ifdef EINA_LIST_MAGIC
    if (list)
      EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    l = eina_list_data_find_list(list, data);
    return eina_list_remove_list(list, l);
 }
@@ -781,8 +793,9 @@ eina_list_remove_list(Eina_List *list, Eina_List *remove_list)
    if (!remove_list)
      return list;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(remove_list, NULL);
-
+#endif
    if (remove_list->next)
      remove_list->next->prev = remove_list->prev;
 
@@ -796,7 +809,9 @@ eina_list_remove_list(Eina_List *list, Eina_List *remove_list)
 
    if (remove_list == remove_list->accounting->last)
      {
+#ifdef EINA_LIST_MAGIC
         EINA_MAGIC_CHECK_LIST(list, NULL);
+#endif
         list->accounting->last = remove_list->prev;
      }
 
@@ -812,8 +827,9 @@ eina_list_free(Eina_List *list)
    if (!list)
      return NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    for (l = list; l; )
      {
         free_l = l;
@@ -843,9 +859,10 @@ eina_list_promote_list(Eina_List *list, Eina_List *move_list)
    if (move_list->next == list)
      return move_list;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list,      NULL);
    EINA_MAGIC_CHECK_LIST(move_list, NULL);
-
+#endif
    /* Remove the promoted item from the list. */
    if (!move_list->prev)
      move_list->next->prev = NULL;
@@ -883,9 +900,10 @@ eina_list_demote_list(Eina_List *list, Eina_List *move_list)
    if (move_list == list->accounting->last)
      return list;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list,      NULL);
    EINA_MAGIC_CHECK_LIST(move_list, NULL);
-
+#endif
    /* Update pointer list if necessary. */
    if (list == move_list)
      {
@@ -924,9 +942,10 @@ eina_list_move(Eina_List **to, Eina_List **from, void *data)
    EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
 
+#ifdef EINA_LIST_MAGIC
    if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE);
    EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE);
-
+#endif
    l = eina_list_data_find_list(*from, data);
    EINA_SAFETY_ON_NULL_RETURN_VAL(l, EINA_FALSE);
 
@@ -941,10 +960,11 @@ eina_list_move_list(Eina_List **to, Eina_List **from, Eina_List *data)
    EINA_SAFETY_ON_NULL_RETURN_VAL(to, EINA_FALSE);
    EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE);
 
+#ifdef EINA_LIST_MAGIC
    if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE);
    EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE);
    EINA_MAGIC_CHECK_LIST(data, EINA_FALSE);
-
+#endif
    *to = eina_list_append(*to, data->data);
    *from = eina_list_remove_list(*from, data);
    return EINA_TRUE;
@@ -956,9 +976,10 @@ eina_list_data_find_list(const Eina_List *list, const void *data)
    const Eina_List *l;
    void *list_data;
 
+#ifdef EINA_LIST_MAGIC
    if (list)
      EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    EINA_LIST_FOREACH(list, l, list_data)
      {
         if (list_data == data)
@@ -986,9 +1007,10 @@ eina_list_nth_list(const Eina_List *list, unsigned int n)
    const Eina_List *l;
    unsigned int i;
 
+#ifdef EINA_LIST_MAGIC
    if (list)
      EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    /* check for non-existing nodes */
    if ((!list) || (n > (list->accounting->count - 1)))
      return NULL;
@@ -1023,8 +1045,9 @@ eina_list_reverse(Eina_List *list)
    if (!list)
      return NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    l1 = list;
    l2 = list->accounting->last;
    while (l1 != l2)
@@ -1054,8 +1077,9 @@ eina_list_reverse_clone(const Eina_List *list)
    if (!list)
      return NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    lclone = NULL;
    EINA_LIST_FOREACH(list, l, data)
       lclone = eina_list_prepend(lclone, data);
@@ -1073,8 +1097,9 @@ eina_list_clone(const Eina_List *list)
    if (!list)
      return NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    lclone = NULL;
    EINA_LIST_FOREACH(list, l, data)
       lclone = eina_list_append(lclone, data);
@@ -1095,8 +1120,9 @@ eina_list_sort(Eina_List *list, unsigned int limit, Eina_Compare_Cb func)
    if (!list)
      return NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    /* if the caller specified an invalid limit, sort the whole list */
    if ((limit == 0) ||
        (limit > list->accounting->count))
@@ -1161,8 +1187,9 @@ eina_list_shuffle(Eina_List *list, Eina_Random_Cb func)
    if (!list)
      return NULL;
 
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, NULL);
-
+#endif
    accounting = list->accounting;
    n = accounting->count;
    shuffled_list = shuffled_last = NULL;
@@ -1623,8 +1650,9 @@ eina_list_data_idx(const Eina_List *list, void *data)
    int ret = 0;
 
    if (!list) return -1;
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC_CHECK_LIST(list, -1);
-
+#endif
    EINA_LIST_FOREACH(list, l, list_data)
      {
         if (list_data == data)
index 985a5cd..5b66c92 100644 (file)
 
 #include "eina_config.h"
 
+// magic number checks for eina list nodes - this costs extra memory and a
+// few cycles for some safety = aybe during debugging/devel only?
+//#define EINA_LIST_MAGIC 1
+
 #include "eina_types.h"
 #include "eina_iterator.h"
 #include "eina_accessor.h"
-#include "eina_magic.h"
+#ifdef EINA_LIST_MAGIC
+# include "eina_magic.h"
+#endif
 
 /**
  * @page eina_list_01_example_page Adding elements to Eina_List
@@ -323,8 +329,9 @@ struct _Eina_List
    Eina_List            *next; /**< Next member in the list */
    Eina_List            *prev; /**< Previous member in the list */
    Eina_List_Accounting *accounting; /**< Private list accounting info - don't touch */
-
+#ifdef EINA_LIST_MAGIC
    EINA_MAGIC
+#endif
 };
 
 /**