eina_hash_foreach doesn't allow safe removal of entry during iteration anymore.

SVN revision: 37354
This commit is contained in:
Cedric BAIL 2008-10-31 11:07:10 +00:00
parent cdf08d5696
commit 9840ad8c4e
2 changed files with 26 additions and 12 deletions

View File

@ -239,12 +239,11 @@ evas_cache_engine_image_dup(const Evas_Cache_Engine_Image_Func *cb, Evas_Cache_E
}
static Evas_Bool
_evas_cache_engine_image_free_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata)
_evas_cache_engine_image_free_cb(__UNUSED__ const Evas_Hash *hash, __UNUSED__ const void *key, void *data, void *fdata)
{
Evas_Cache_Engine_Image *cache = fdata;
Engine_Image_Entry *eim = data;
Eina_List **delete_list = fdata;
_evas_cache_engine_image_dealloc(cache, eim);
*delete_list = eina_list_prepend(*delete_list, data);
return 1;
}
@ -267,13 +266,23 @@ EAPI void
evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache)
{
Engine_Image_Entry *eim;
Eina_List *delete_list = NULL;
assert(cache != NULL);
if (cache->func.debug) cache->func.debug("shutdown-engine", NULL);
evas_hash_foreach(cache->inactiv, _evas_cache_engine_image_free_cb, cache);
evas_hash_foreach(cache->inactiv, _evas_cache_engine_image_free_cb, &delete_list);
evas_hash_foreach(cache->activ, _evas_cache_engine_image_free_cb, &delete_list);
while (delete_list)
{
_evas_cache_engine_image_dealloc(cache, eina_list_data_get(delete_list));
delete_list = eina_list_remove_list(delete_list, delete_list);
}
evas_hash_free(cache->inactiv);
evas_hash_free(cache->activ);
/* This is mad, I am about to destroy image still alive, but we need to prevent leak. */
while (cache->dirty)
@ -282,8 +291,6 @@ evas_cache_engine_image_shutdown(Evas_Cache_Engine_Image *cache)
_evas_cache_engine_image_dealloc(cache, eim);
}
evas_hash_foreach(cache->activ, _evas_cache_engine_image_free_cb, cache);
evas_hash_free(cache->activ);
evas_cache_image_shutdown(cache->parent);
if (cache->brother)

View File

@ -376,12 +376,11 @@ evas_cache_image_init(const Evas_Cache_Image_Func *cb)
}
static Evas_Bool
_evas_cache_image_free_cb(const Evas_Hash *hash, const char *key, void *data, void *fdata)
_evas_cache_image_free_cb(__UNUSED__ const Evas_Hash *hash, __UNUSED__ const void *key, void *data, void *fdata)
{
Evas_Cache_Image *cache = fdata;
Image_Entry *im = data;
Eina_List **delete_list = fdata;
_evas_cache_image_entry_delete(cache, im);
*delete_list = eina_list_prepend(*delete_list, data);
return 1;
}
@ -390,6 +389,7 @@ EAPI void
evas_cache_image_shutdown(Evas_Cache_Image *cache)
{
Image_Entry *im;
Eina_List *delete_list;
assert(cache != NULL);
cache->references--;
@ -416,7 +416,14 @@ evas_cache_image_shutdown(Evas_Cache_Image *cache)
_evas_cache_image_entry_delete(cache, im);
}
evas_hash_foreach(cache->activ, _evas_cache_image_free_cb, cache);
evas_hash_foreach(cache->activ, _evas_cache_image_free_cb, &delete_list);
while (delete_list)
{
_evas_cache_image_entry_delete(cache, eina_list_data_get(delete_list));
delete_list = eina_list_remove_list(delete_list, delete_list);
}
evas_hash_free(cache->activ);
evas_hash_free(cache->inactiv);