From 498418bb67c1642d5ccdaa71b393eb57060f1d32 Mon Sep 17 00:00:00 2001 From: Jean-Philippe Andre Date: Wed, 30 Oct 2013 14:57:52 +0900 Subject: [PATCH] evas/cserve2: Prevent potential infinite loop (shutdown) In shutdown, I've encountered an infinite loop. It SHOULD NOT possibly happen, but somehow some image was marked as delete_me=1 but still present in the LRU. --- src/lib/evas/cache2/evas_cache2.c | 23 ++++++++--------------- 1 file changed, 8 insertions(+), 15 deletions(-) diff --git a/src/lib/evas/cache2/evas_cache2.c b/src/lib/evas/cache2/evas_cache2.c index 5ec5b6dad0..921d04a364 100644 --- a/src/lib/evas/cache2/evas_cache2.c +++ b/src/lib/evas/cache2/evas_cache2.c @@ -523,26 +523,19 @@ evas_cache2_shutdown(Evas_Cache2 *cache) { Eina_List *delete_list; Image_Entry *im; + Eina_Inlist *il; + + EINA_INLIST_FOREACH_SAFE(cache->lru, il, im) + _evas_cache2_image_entry_delete(cache, im); - while (cache->lru) - { - im = (Image_Entry *)cache->lru; - _evas_cache2_image_entry_delete(cache, im); - } /* This is mad, I am about to destroy image still alive, but we need to prevent leak. */ - while (cache->dirty) - { - im = (Image_Entry *)cache->dirty; - _evas_cache2_image_entry_delete(cache, im); - } + EINA_INLIST_FOREACH_SAFE(cache->dirty, il, im) + _evas_cache2_image_entry_delete(cache, im); delete_list = NULL; eina_hash_foreach(cache->activ, _evas_cache2_image_free_cb, &delete_list); - while (delete_list) - { - _evas_cache2_image_entry_delete(cache, eina_list_data_get(delete_list)); - delete_list = eina_list_remove_list(delete_list, delete_list); - } + EINA_LIST_FREE(delete_list, im) + _evas_cache2_image_entry_delete(cache, im); eina_hash_free(cache->activ); eina_hash_free(cache->inactiv);