From: Carsten Haitzler (Rasterman) Date: Wed, 21 Aug 2019 13:24:21 +0000 (+0100) Subject: eina list - make eina list magic optional and for now turn it off X-Git-Tag: submit/tizen/20190826.011117~40 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=953f380f103f85660cc61714d89dbbb1ab786723;p=platform%2Fupstream%2Fefl.git 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. --- diff --git a/src/lib/eina/eina_list.c b/src/lib/eina/eina_list.c index a5a6ba7..2e7e24c 100644 --- a/src/lib/eina/eina_list.c +++ b/src/lib/eina/eina_list.c @@ -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) diff --git a/src/lib/eina/eina_list.h b/src/lib/eina/eina_list.h index 985a5cd..5b66c92 100644 --- a/src/lib/eina/eina_list.h +++ b/src/lib/eina/eina_list.h @@ -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 }; /**