From 2fdad9294876f475225618e9f50d558a62c6bcf3 Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Sat, 14 Sep 2019 19:12:44 -0700 Subject: eina: add code to help debug leaking Eina_Value. Reviewed-by: Mike Blumenkrantz Differential Revision: https://phab.enlightenment.org/D9942 --- src/lib/eina/eina_value.c | 41 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 41 insertions(+) (limited to 'src/lib/eina') diff --git a/src/lib/eina/eina_value.c b/src/lib/eina/eina_value.c index 3df0baa..63f45b9 100644 --- a/src/lib/eina/eina_value.c +++ b/src/lib/eina/eina_value.c @@ -5279,6 +5279,9 @@ typedef struct _Eina_Value_Inner_Mp Eina_Value_Inner_Mp; struct _Eina_Value_Inner_Mp { Eina_Mempool *mempool; +#ifdef DEBUG + int size; +#endif int references; }; @@ -5310,6 +5313,9 @@ _eina_value_inner_mp_get(int size) return NULL; imp->references = 0; +#ifdef DEBUG + imp->size = size; +#endif imp->mempool = eina_mempool_add(_eina_value_mp_choice, "Eina_Value_Inner_Mp", NULL, size, 16); @@ -5517,7 +5523,42 @@ eina_value_init(void) Eina_Bool eina_value_shutdown(void) { +#ifdef DEBUG + Eina_Iterator *it; + Eina_Value_Inner_Mp *imp; +#endif + eina_lock_take(&_eina_value_inner_mps_lock); + +#ifdef DEBUG + it = eina_hash_iterator_data_new(_eina_value_inner_mps); + EINA_ITERATOR_FOREACH(it, imp) + { + Eina_Iterator *mit; + Eina_Value *value; + + fprintf(stderr, "There is still %i Eina_Value in pool of size %i\n", + imp->references, imp->size); + mit = eina_mempool_iterator_new(imp->mempool); + EINA_ITERATOR_FOREACH(mit, value) + { + if (value->type) + { + char *str = eina_value_to_string(value); + fprintf(stderr, "Value %p of type '%s' containing '%s' still allocated.\n", + value, value->type->name, str); + free(str); + } + else + { + fprintf(stderr, "Unknown type found for value %p\n", value); + } + } + eina_iterator_free(mit); + } + eina_iterator_free(it); +#endif + if (eina_hash_population(_eina_value_inner_mps) != 0) ERR("Cannot free eina_value internal memory pools -- still in use!"); else -- cgit v1.1