ethumb: fix race condition and memory leak.

NOTE: that's a first obvious patch thanks to Gustavo reviews.
More work needed, but some decision should be discussed first.


SVN revision: 62265
This commit is contained in:
Cedric BAIL 2011-08-09 20:36:28 +00:00
parent fc80ec34c2
commit 77851c1891
1 changed files with 12 additions and 5 deletions

View File

@ -610,7 +610,10 @@ _ethumb_client_exists_end(void *data, Ecore_Thread *thread __UNUSED__)
async->source->ethumb_dirty = ethumb_cmp(tmp, async->dup);
EINA_LIST_FREE(async->callbacks, cb)
{
cb->exists_cb(async->source, (Ethumb_Exists*) async, async->exists, (void*) cb->data);
free(cb);
}
async->source->ethumb = tmp;
async->thread = NULL;
@ -2144,6 +2147,7 @@ ethumb_client_thumb_exists(Ethumb_Client *client, Ethumb_Client_Thumb_Exists_Cb
{
Ethumb_Async_Exists_Cb *cb;
Ethumb_Async_Exists *async;
Ecore_Thread *t;
EINA_SAFETY_ON_NULL_RETURN_VAL(client, NULL);
@ -2182,11 +2186,13 @@ ethumb_client_thumb_exists(Ethumb_Client *client, Ethumb_Client_Thumb_Exists_Cb
async->callbacks = eina_list_append(NULL, cb);
EINA_REFCOUNT_INIT(async);
async->thread = ecore_thread_run(_ethumb_client_exists_heavy,
t = ecore_thread_run(_ethumb_client_exists_heavy,
_ethumb_client_exists_end,
_ethumb_client_exists_end,
async);
if (!t) return NULL;
async->thread = t;
eina_hash_direct_add(_exists_request, async->dup, async);
return (Ethumb_Exists*) async;
@ -2208,6 +2214,7 @@ ethumb_client_thumb_exists_cancel(Ethumb_Exists *exists, Ethumb_Client_Thumb_Exi
if (cb->exists_cb == exists_cb && cb->data == data)
{
async->callbacks = eina_list_remove_list(async->callbacks, l);
free(cb);
break;
}