eina list - make eina list magic optional and for now turn it off

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.
This commit is contained in:
Carsten Haitzler 2019-08-21 14:24:21 +01:00
parent e15d9c86df
commit 2be2c3c6c3
2 changed files with 88 additions and 53 deletions

View File

@ -81,9 +81,10 @@
* @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)

View File

@ -23,10 +23,16 @@
#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
};
/**