jpeg pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=498418bb67c1642d5ccdaa71b393eb57060f1d32

commit 498418bb67c1642d5ccdaa71b393eb57060f1d32
Author: Jean-Philippe Andre <[email protected]>
Date:   Wed Oct 30 14:57:52 2013 +0900

    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 5ec5b6d..921d04a 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);

-- 


Reply via email to