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 * @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_ITERATOR_STR[] = "Eina List Iterator";
static const char EINA_MAGIC_LIST_ACCESSOR_STR[] = "Eina List Accessor"; 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"; 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) } 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, ...) \ #define EINA_MAGIC_CHECK_LIST_ITERATOR(d, ...) \
do { \ do { \
if (!EINA_MAGIC_CHECK(d, EINA_MAGIC_LIST_ITERATOR)) \ 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) } 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 #define EINA_LIST_SORT_STACK_SIZE 32
@ -143,7 +146,6 @@ struct _Eina_Iterator_List
const Eina_List *head; const Eina_List *head;
const Eina_List *current; const Eina_List *current;
EINA_MAGIC EINA_MAGIC
}; };
@ -155,7 +157,6 @@ struct _Eina_Accessor_List
const Eina_List *current; const Eina_List *current;
unsigned int index; unsigned int index;
EINA_MAGIC EINA_MAGIC
}; };
@ -183,9 +184,9 @@ _eina_list_mempool_accounting_new(EINA_UNUSED Eina_List *list)
sizeof (Eina_List_Accounting)); sizeof (Eina_List_Accounting));
if (!tmp) if (!tmp)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST_ACCOUNTING); EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST_ACCOUNTING);
#endif
return tmp; return tmp;
} }
@ -204,9 +205,10 @@ _eina_list_list_free(void *list)
static inline void static inline void
_eina_list_mempool_accounting_free(Eina_List_Accounting *accounting) _eina_list_mempool_accounting_free(Eina_List_Accounting *accounting)
{ {
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST_ACCOUNTING(accounting); EINA_MAGIC_CHECK_LIST_ACCOUNTING(accounting);
EINA_MAGIC_SET(accounting, EINA_MAGIC_NONE); EINA_MAGIC_SET(accounting, EINA_MAGIC_NONE);
#endif
eina_freeq_ptr_main_add(accounting, _eina_list_accounting_free, sizeof(*accounting)); 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)); tmp = eina_mempool_malloc(_eina_list_mp, sizeof (Eina_List));
if (!tmp) if (!tmp)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST); EINA_MAGIC_SET(tmp, EINA_MAGIC_LIST);
#endif
return tmp; return tmp;
} }
static inline void static inline void
_eina_list_mempool_list_free(Eina_List *list) _eina_list_mempool_list_free(Eina_List *list)
{ {
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list); EINA_MAGIC_CHECK_LIST(list);
#endif
if (list->accounting) if (list->accounting)
{ {
list->accounting->count--; list->accounting->count--;
if (list->accounting->count == 0) if (list->accounting->count == 0)
_eina_list_mempool_accounting_free(list->accounting); _eina_list_mempool_accounting_free(list->accounting);
} }
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_SET(list, EINA_MAGIC_NONE); EINA_MAGIC_SET(list, EINA_MAGIC_NONE);
#endif
eina_freeq_ptr_main_add(list, _eina_list_list_free, sizeof(*list)); eina_freeq_ptr_main_add(list, _eina_list_list_free, sizeof(*list));
} }
static Eina_List * static Eina_List *
_eina_list_setup_accounting(Eina_List *list) _eina_list_setup_accounting(Eina_List *list)
{ {
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
list->accounting = _eina_list_mempool_accounting_new(list); list->accounting = _eina_list_mempool_accounting_new(list);
if (!list->accounting) if (!list->accounting)
goto on_error; goto on_error;
@ -261,9 +266,10 @@ on_error:
static inline void static inline void
_eina_list_update_accounting(Eina_List *list, Eina_List *new_list) _eina_list_update_accounting(Eina_List *list, Eina_List *new_list)
{ {
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list); EINA_MAGIC_CHECK_LIST(list);
EINA_MAGIC_CHECK_LIST(new_list); EINA_MAGIC_CHECK_LIST(new_list);
#endif
list->accounting->count++; list->accounting->count++;
new_list->accounting = list->accounting; new_list->accounting = list->accounting;
} }
@ -287,7 +293,6 @@ static Eina_Bool
eina_list_iterator_next(Eina_Iterator_List *it, void **data) eina_list_iterator_next(Eina_Iterator_List *it, void **data)
{ {
EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE); EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
if (!it->current) if (!it->current)
return EINA_FALSE; return EINA_FALSE;
@ -302,7 +307,6 @@ static Eina_Bool
eina_list_iterator_prev(Eina_Iterator_List *it, void **data) eina_list_iterator_prev(Eina_Iterator_List *it, void **data)
{ {
EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE); EINA_MAGIC_CHECK_LIST_ITERATOR(it, EINA_FALSE);
if (!it->current) if (!it->current)
return EINA_FALSE; return EINA_FALSE;
@ -317,7 +321,6 @@ static Eina_List *
eina_list_iterator_get_container(Eina_Iterator_List *it) eina_list_iterator_get_container(Eina_Iterator_List *it)
{ {
EINA_MAGIC_CHECK_LIST_ITERATOR(it, NULL); EINA_MAGIC_CHECK_LIST_ITERATOR(it, NULL);
return (Eina_List *)it->head; return (Eina_List *)it->head;
} }
@ -325,7 +328,6 @@ static void
eina_list_iterator_free(Eina_Iterator_List *it) eina_list_iterator_free(Eina_Iterator_List *it)
{ {
EINA_MAGIC_CHECK_LIST_ITERATOR(it); EINA_MAGIC_CHECK_LIST_ITERATOR(it);
MAGIC_FREE(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; unsigned int i;
EINA_MAGIC_CHECK_LIST_ACCESSOR(it, EINA_FALSE); EINA_MAGIC_CHECK_LIST_ACCESSOR(it, EINA_FALSE);
if (idx >= eina_list_count(it->head)) if (idx >= eina_list_count(it->head))
return EINA_FALSE; return EINA_FALSE;
@ -395,7 +396,6 @@ static Eina_List *
eina_list_accessor_get_container(Eina_Accessor_List *it) eina_list_accessor_get_container(Eina_Accessor_List *it)
{ {
EINA_MAGIC_CHECK_LIST_ACCESSOR(it, NULL); EINA_MAGIC_CHECK_LIST_ACCESSOR(it, NULL);
return (Eina_List *)it->head; return (Eina_List *)it->head;
} }
@ -403,7 +403,6 @@ static void
eina_list_accessor_free(Eina_Accessor_List *it) eina_list_accessor_free(Eina_Accessor_List *it)
{ {
EINA_MAGIC_CHECK_LIST_ACCESSOR(it); EINA_MAGIC_CHECK_LIST_ACCESSOR(it);
MAGIC_FREE(it); MAGIC_FREE(it);
} }
@ -413,7 +412,6 @@ eina_list_accessor_clone(Eina_Accessor_List *list)
Eina_Accessor_List *ac; Eina_Accessor_List *ac;
EINA_MAGIC_CHECK_LIST_ACCESSOR(list, NULL); EINA_MAGIC_CHECK_LIST_ACCESSOR(list, NULL);
EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(list, NULL);
ac = calloc(1, sizeof (Eina_Accessor_List)); ac = calloc(1, sizeof (Eina_Accessor_List));
@ -429,8 +427,9 @@ eina_list_sort_rebuild_prev(Eina_List *list)
{ {
Eina_List *prev = NULL; Eina_List *prev = NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
for (; list; list = list->next) for (; list; list = list->next)
{ {
list->prev = prev; list->prev = prev;
@ -530,10 +529,12 @@ eina_list_init(void)
} }
#define EMS(n) eina_magic_string_static_set(n, n ## _STR) #define EMS(n) eina_magic_string_static_set(n, n ## _STR)
#ifdef EINA_LIST_MAGIC
EMS(EINA_MAGIC_LIST); EMS(EINA_MAGIC_LIST);
EMS(EINA_MAGIC_LIST_ACCOUNTING);
#endif
EMS(EINA_MAGIC_LIST_ITERATOR); EMS(EINA_MAGIC_LIST_ITERATOR);
EMS(EINA_MAGIC_LIST_ACCESSOR); EMS(EINA_MAGIC_LIST_ACCESSOR);
EMS(EINA_MAGIC_LIST_ACCOUNTING);
#undef EMS #undef EMS
return EINA_TRUE; return EINA_TRUE;
@ -595,8 +596,9 @@ eina_list_append(Eina_List *list, const void *data)
return _eina_list_setup_accounting(new_l); return _eina_list_setup_accounting(new_l);
} }
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST_GOTO(list, on_error); EINA_MAGIC_CHECK_LIST_GOTO(list, on_error);
#endif
l = list->accounting->last; l = list->accounting->last;
list->accounting->last = new_l; 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); _eina_list_update_accounting(list, new_l);
return list; return list;
#ifdef EINA_LIST_MAGIC
on_error: on_error:
#endif
_eina_list_mempool_list_free(new_l); _eina_list_mempool_list_free(new_l);
return NULL; return NULL;
} }
@ -626,15 +629,18 @@ eina_list_prepend(Eina_List *list, const void *data)
if (!list) if (!list)
return _eina_list_setup_accounting(new_l); return _eina_list_setup_accounting(new_l);
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST_GOTO(list, on_error); EINA_MAGIC_CHECK_LIST_GOTO(list, on_error);
#endif
list->prev = new_l; list->prev = new_l;
_eina_list_update_accounting(list, new_l); _eina_list_update_accounting(list, new_l);
return new_l; return new_l;
#ifdef EINA_LIST_MAGIC
on_error: on_error:
#endif
_eina_list_mempool_list_free(new_l); _eina_list_mempool_list_free(new_l);
return NULL; return NULL;
} }
@ -647,9 +653,10 @@ eina_list_append_relative(Eina_List *list,
Eina_List *l; Eina_List *l;
void *list_data; void *list_data;
#ifdef EINA_LIST_MAGIC
if (list) if (list)
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
EINA_LIST_FOREACH(list, l, list_data) EINA_LIST_FOREACH(list, l, list_data)
{ {
if (list_data == relative) if (list_data == relative)
@ -669,7 +676,9 @@ eina_list_append_relative_list(Eina_List *list,
if ((!list) || (!relative)) if ((!list) || (!relative))
return eina_list_append(list, data); return eina_list_append(list, data);
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(relative, NULL); EINA_MAGIC_CHECK_LIST(relative, NULL);
#endif
new_l = _eina_list_mempool_list_new(list); new_l = _eina_list_mempool_list_new(list);
if (!new_l) return list; if (!new_l) return list;
@ -699,9 +708,10 @@ eina_list_prepend_relative(Eina_List *list,
Eina_List *l; Eina_List *l;
void *list_data; void *list_data;
#ifdef EINA_LIST_MAGIC
if (list) if (list)
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
EINA_LIST_FOREACH(list, l, list_data) EINA_LIST_FOREACH(list, l, list_data)
{ {
if (list_data == relative) if (list_data == relative)
@ -720,8 +730,9 @@ eina_list_prepend_relative_list(Eina_List *list,
if ((!list) || (!relative)) if ((!list) || (!relative))
return eina_list_prepend(list, data); return eina_list_prepend(list, data);
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(relative, NULL); EINA_MAGIC_CHECK_LIST(relative, NULL);
#endif
new_l = _eina_list_mempool_list_new(list); new_l = _eina_list_mempool_list_new(list);
if (!new_l) return list; if (!new_l) return list;
@ -763,9 +774,10 @@ eina_list_remove(Eina_List *list, const void *data)
{ {
Eina_List *l; Eina_List *l;
#ifdef EINA_LIST_MAGIC
if (list) if (list)
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
l = eina_list_data_find_list(list, data); l = eina_list_data_find_list(list, data);
return eina_list_remove_list(list, l); 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) if (!remove_list)
return list; return list;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(remove_list, NULL); EINA_MAGIC_CHECK_LIST(remove_list, NULL);
#endif
if (remove_list->next) if (remove_list->next)
remove_list->next->prev = remove_list->prev; 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) if (remove_list == remove_list->accounting->last)
{ {
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
list->accounting->last = remove_list->prev; list->accounting->last = remove_list->prev;
} }
@ -812,8 +827,9 @@ eina_list_free(Eina_List *list)
if (!list) if (!list)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
for (l = list; l; ) for (l = list; l; )
{ {
free_l = l; free_l = l;
@ -843,9 +859,10 @@ eina_list_promote_list(Eina_List *list, Eina_List *move_list)
if (move_list->next == list) if (move_list->next == list)
return move_list; return move_list;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
EINA_MAGIC_CHECK_LIST(move_list, NULL); EINA_MAGIC_CHECK_LIST(move_list, NULL);
#endif
/* Remove the promoted item from the list. */ /* Remove the promoted item from the list. */
if (!move_list->prev) if (!move_list->prev)
move_list->next->prev = NULL; 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) if (move_list == list->accounting->last)
return list; return list;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
EINA_MAGIC_CHECK_LIST(move_list, NULL); EINA_MAGIC_CHECK_LIST(move_list, NULL);
#endif
/* Update pointer list if necessary. */ /* Update pointer list if necessary. */
if (list == move_list) 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(from, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(data, EINA_FALSE);
#ifdef EINA_LIST_MAGIC
if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE); if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE);
EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE); EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE);
#endif
l = eina_list_data_find_list(*from, data); l = eina_list_data_find_list(*from, data);
EINA_SAFETY_ON_NULL_RETURN_VAL(l, EINA_FALSE); 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(to, EINA_FALSE);
EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE); EINA_SAFETY_ON_NULL_RETURN_VAL(from, EINA_FALSE);
#ifdef EINA_LIST_MAGIC
if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE); if (*to) EINA_MAGIC_CHECK_LIST(*to, EINA_FALSE);
EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE); EINA_MAGIC_CHECK_LIST(*from, EINA_FALSE);
EINA_MAGIC_CHECK_LIST(data, EINA_FALSE); EINA_MAGIC_CHECK_LIST(data, EINA_FALSE);
#endif
*to = eina_list_append(*to, data->data); *to = eina_list_append(*to, data->data);
*from = eina_list_remove_list(*from, data); *from = eina_list_remove_list(*from, data);
return EINA_TRUE; return EINA_TRUE;
@ -956,9 +976,10 @@ eina_list_data_find_list(const Eina_List *list, const void *data)
const Eina_List *l; const Eina_List *l;
void *list_data; void *list_data;
#ifdef EINA_LIST_MAGIC
if (list) if (list)
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
EINA_LIST_FOREACH(list, l, list_data) EINA_LIST_FOREACH(list, l, list_data)
{ {
if (list_data == data) if (list_data == data)
@ -986,9 +1007,10 @@ eina_list_nth_list(const Eina_List *list, unsigned int n)
const Eina_List *l; const Eina_List *l;
unsigned int i; unsigned int i;
#ifdef EINA_LIST_MAGIC
if (list) if (list)
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
/* check for non-existing nodes */ /* check for non-existing nodes */
if ((!list) || (n > (list->accounting->count - 1))) if ((!list) || (n > (list->accounting->count - 1)))
return NULL; return NULL;
@ -1023,8 +1045,9 @@ eina_list_reverse(Eina_List *list)
if (!list) if (!list)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
l1 = list; l1 = list;
l2 = list->accounting->last; l2 = list->accounting->last;
while (l1 != l2) while (l1 != l2)
@ -1054,8 +1077,9 @@ eina_list_reverse_clone(const Eina_List *list)
if (!list) if (!list)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
lclone = NULL; lclone = NULL;
EINA_LIST_FOREACH(list, l, data) EINA_LIST_FOREACH(list, l, data)
lclone = eina_list_prepend(lclone, data); lclone = eina_list_prepend(lclone, data);
@ -1073,8 +1097,9 @@ eina_list_clone(const Eina_List *list)
if (!list) if (!list)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
lclone = NULL; lclone = NULL;
EINA_LIST_FOREACH(list, l, data) EINA_LIST_FOREACH(list, l, data)
lclone = eina_list_append(lclone, 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) if (!list)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
/* if the caller specified an invalid limit, sort the whole list */ /* if the caller specified an invalid limit, sort the whole list */
if ((limit == 0) || if ((limit == 0) ||
(limit > list->accounting->count)) (limit > list->accounting->count))
@ -1161,8 +1187,9 @@ eina_list_shuffle(Eina_List *list, Eina_Random_Cb func)
if (!list) if (!list)
return NULL; return NULL;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, NULL); EINA_MAGIC_CHECK_LIST(list, NULL);
#endif
accounting = list->accounting; accounting = list->accounting;
n = accounting->count; n = accounting->count;
shuffled_list = shuffled_last = NULL; shuffled_list = shuffled_last = NULL;
@ -1623,8 +1650,9 @@ eina_list_data_idx(const Eina_List *list, void *data)
int ret = 0; int ret = 0;
if (!list) return -1; if (!list) return -1;
#ifdef EINA_LIST_MAGIC
EINA_MAGIC_CHECK_LIST(list, -1); EINA_MAGIC_CHECK_LIST(list, -1);
#endif
EINA_LIST_FOREACH(list, l, list_data) EINA_LIST_FOREACH(list, l, list_data)
{ {
if (list_data == data) if (list_data == data)

View File

@ -23,10 +23,16 @@
#include "eina_config.h" #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_types.h"
#include "eina_iterator.h" #include "eina_iterator.h"
#include "eina_accessor.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 * @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 *next; /**< Next member in the list */
Eina_List *prev; /**< Previous member in the list */ Eina_List *prev; /**< Previous member in the list */
Eina_List_Accounting *accounting; /**< Private list accounting info - don't touch */ Eina_List_Accounting *accounting; /**< Private list accounting info - don't touch */
#ifdef EINA_LIST_MAGIC
EINA_MAGIC EINA_MAGIC
#endif
}; };
/** /**