forked from enlightenment/efl
parent
f97a64ca03
commit
c958177e51
|
@ -124,12 +124,11 @@ struct _Ethumb_Client
|
|||
} die;
|
||||
const char *object_path;
|
||||
|
||||
int refcount;
|
||||
EINA_REFCOUNT;
|
||||
|
||||
Eina_Bool ethumb_dirty : 1;
|
||||
Eina_Bool connected : 1;
|
||||
Eina_Bool server_started : 1;
|
||||
Eina_Bool delete_me : 1;
|
||||
};
|
||||
|
||||
struct _ethumb_pending_add
|
||||
|
@ -179,7 +178,7 @@ struct _Ethumb_Async_Exists
|
|||
Eina_List *callbacks;
|
||||
|
||||
Ecore_Thread *thread;
|
||||
int refcount;
|
||||
EINA_REFCOUNT;
|
||||
|
||||
Eina_Bool exists : 1;
|
||||
};
|
||||
|
@ -258,20 +257,105 @@ __dbus_iter_type_check(int type, int expected, const char *expected_name)
|
|||
} \
|
||||
while (0)
|
||||
|
||||
static void
|
||||
_ethumb_client_free(Ethumb_Client *client)
|
||||
{
|
||||
void *data;
|
||||
|
||||
if (!client->connected)
|
||||
goto end_connection;
|
||||
|
||||
EINA_LIST_FREE(client->pending_add, data)
|
||||
{
|
||||
struct _ethumb_pending_add *pending = data;
|
||||
eina_stringshare_del(pending->file);
|
||||
eina_stringshare_del(pending->key);
|
||||
eina_stringshare_del(pending->thumb);
|
||||
eina_stringshare_del(pending->thumb_key);
|
||||
dbus_pending_call_cancel(pending->pending_call);
|
||||
dbus_pending_call_unref(pending->pending_call);
|
||||
if (pending->free_data)
|
||||
pending->free_data(pending->data);
|
||||
free(pending);
|
||||
}
|
||||
|
||||
EINA_LIST_FREE(client->pending_gen, data)
|
||||
{
|
||||
struct _ethumb_pending_gen *pending = data;
|
||||
eina_stringshare_del(pending->file);
|
||||
eina_stringshare_del(pending->key);
|
||||
eina_stringshare_del(pending->thumb);
|
||||
eina_stringshare_del(pending->thumb_key);
|
||||
if (pending->free_data)
|
||||
pending->free_data(pending->data);
|
||||
free(pending);
|
||||
}
|
||||
|
||||
EINA_LIST_FREE(client->pending_remove, data)
|
||||
{
|
||||
struct _ethumb_pending_remove *pending = data;
|
||||
dbus_pending_call_cancel(pending->pending_call);
|
||||
dbus_pending_call_unref(pending->pending_call);
|
||||
if (pending->free_data)
|
||||
pending->free_data(pending->data);
|
||||
free(pending);
|
||||
}
|
||||
|
||||
if (client->pending_clear)
|
||||
{
|
||||
dbus_pending_call_cancel(client->pending_clear);
|
||||
dbus_pending_call_unref(client->pending_clear);
|
||||
}
|
||||
|
||||
end_connection:
|
||||
if (client->object_path)
|
||||
eina_stringshare_del(client->object_path);
|
||||
|
||||
if (client->pending_new)
|
||||
dbus_pending_call_cancel(client->pending_new);
|
||||
|
||||
if (client->unique_name)
|
||||
eina_stringshare_del(client->unique_name);
|
||||
|
||||
if (client->pending_get_name_owner)
|
||||
dbus_pending_call_cancel(client->pending_get_name_owner);
|
||||
|
||||
if (client->pending_start_service_by_name)
|
||||
dbus_pending_call_cancel(client->pending_start_service_by_name);
|
||||
|
||||
ethumb_free(client->ethumb);
|
||||
|
||||
e_dbus_signal_handler_del(client->conn, client->name_owner_changed_handler);
|
||||
if (client->connected)
|
||||
e_dbus_signal_handler_del(client->conn, client->generated_signal);
|
||||
e_dbus_connection_close(client->conn);
|
||||
|
||||
if (client->connect.free_data)
|
||||
client->connect.free_data(client->connect.data);
|
||||
if (client->die.free_data)
|
||||
client->die.free_data(client->die.data);
|
||||
|
||||
free(client);
|
||||
}
|
||||
|
||||
static void
|
||||
_ethumb_async_delete(void *data)
|
||||
{
|
||||
Ethumb_Async_Exists *async = data;
|
||||
|
||||
ethumb_free(async->dup);
|
||||
async->source->refcount--;
|
||||
|
||||
if (async->source->delete_me == EINA_TRUE)
|
||||
ethumb_client_disconnect(async->source);
|
||||
EINA_REFCOUNT_UNREF(async->source, _ethumb_client_free);
|
||||
|
||||
free(async);
|
||||
}
|
||||
|
||||
static void
|
||||
_ethumb_async_cancel(Ethumb_Async_Exists *async)
|
||||
{
|
||||
ecore_thread_cancel(async->thread);
|
||||
}
|
||||
|
||||
static void
|
||||
_ethumb_client_name_owner_changed(void *data, DBusMessage *msg)
|
||||
{
|
||||
|
@ -718,6 +802,8 @@ ethumb_client_connect(Ethumb_Client_Connect_Cb connect_cb, const void *data, Ein
|
|||
goto connection_err;
|
||||
}
|
||||
|
||||
EINA_REFCOUNT_INIT(eclient);
|
||||
|
||||
return eclient;
|
||||
|
||||
connection_err:
|
||||
|
@ -743,88 +829,9 @@ err:
|
|||
EAPI void
|
||||
ethumb_client_disconnect(Ethumb_Client *client)
|
||||
{
|
||||
void *data;
|
||||
|
||||
EINA_SAFETY_ON_NULL_RETURN(client);
|
||||
|
||||
client->delete_me = EINA_TRUE;
|
||||
if (client->refcount > 0)
|
||||
return ;
|
||||
|
||||
if (!client->connected)
|
||||
goto end_connection;
|
||||
|
||||
EINA_LIST_FREE(client->pending_add, data)
|
||||
{
|
||||
struct _ethumb_pending_add *pending = data;
|
||||
eina_stringshare_del(pending->file);
|
||||
eina_stringshare_del(pending->key);
|
||||
eina_stringshare_del(pending->thumb);
|
||||
eina_stringshare_del(pending->thumb_key);
|
||||
dbus_pending_call_cancel(pending->pending_call);
|
||||
dbus_pending_call_unref(pending->pending_call);
|
||||
if (pending->free_data)
|
||||
pending->free_data(pending->data);
|
||||
free(pending);
|
||||
}
|
||||
|
||||
EINA_LIST_FREE(client->pending_gen, data)
|
||||
{
|
||||
struct _ethumb_pending_gen *pending = data;
|
||||
eina_stringshare_del(pending->file);
|
||||
eina_stringshare_del(pending->key);
|
||||
eina_stringshare_del(pending->thumb);
|
||||
eina_stringshare_del(pending->thumb_key);
|
||||
if (pending->free_data)
|
||||
pending->free_data(pending->data);
|
||||
free(pending);
|
||||
}
|
||||
|
||||
EINA_LIST_FREE(client->pending_remove, data)
|
||||
{
|
||||
struct _ethumb_pending_remove *pending = data;
|
||||
dbus_pending_call_cancel(pending->pending_call);
|
||||
dbus_pending_call_unref(pending->pending_call);
|
||||
if (pending->free_data)
|
||||
pending->free_data(pending->data);
|
||||
free(pending);
|
||||
}
|
||||
|
||||
if (client->pending_clear)
|
||||
{
|
||||
dbus_pending_call_cancel(client->pending_clear);
|
||||
dbus_pending_call_unref(client->pending_clear);
|
||||
}
|
||||
|
||||
end_connection:
|
||||
if (client->object_path)
|
||||
eina_stringshare_del(client->object_path);
|
||||
|
||||
if (client->pending_new)
|
||||
dbus_pending_call_cancel(client->pending_new);
|
||||
|
||||
if (client->unique_name)
|
||||
eina_stringshare_del(client->unique_name);
|
||||
|
||||
if (client->pending_get_name_owner)
|
||||
dbus_pending_call_cancel(client->pending_get_name_owner);
|
||||
|
||||
if (client->pending_start_service_by_name)
|
||||
dbus_pending_call_cancel(client->pending_start_service_by_name);
|
||||
|
||||
ethumb_free(client->ethumb);
|
||||
|
||||
e_dbus_signal_handler_del(client->conn, client->name_owner_changed_handler);
|
||||
if (client->connected)
|
||||
e_dbus_signal_handler_del(client->conn, client->generated_signal);
|
||||
e_dbus_connection_close(client->conn);
|
||||
|
||||
if (client->connect.free_data)
|
||||
client->connect.free_data(client->connect.data);
|
||||
if (client->die.free_data)
|
||||
client->die.free_data(client->die.data);
|
||||
|
||||
free(client);
|
||||
EINA_REFCOUNT_UNREF(client, _ethumb_client_free);
|
||||
}
|
||||
|
||||
/**
|
||||
|
@ -2167,7 +2174,7 @@ ethumb_client_thumb_exists(Ethumb_Client *client, Ethumb_Client_Thumb_Exists_Cb
|
|||
async = eina_hash_find(_exists_request, client->ethumb);
|
||||
if (async)
|
||||
{
|
||||
async->refcount++;
|
||||
EINA_REFCOUNT_REF(async);
|
||||
async->callbacks = eina_list_append(async->callbacks, cb);
|
||||
return (Ethumb_Exists*) async;
|
||||
}
|
||||
|
@ -2182,12 +2189,12 @@ ethumb_client_thumb_exists(Ethumb_Client *client, Ethumb_Client_Thumb_Exists_Cb
|
|||
|
||||
async->dup = ethumb_dup(client->ethumb);
|
||||
async->source = client;
|
||||
async->source->refcount++;
|
||||
EINA_REFCOUNT_REF(async->source);
|
||||
async->exists = EINA_FALSE;
|
||||
|
||||
async->callbacks = eina_list_append(NULL, cb);
|
||||
|
||||
async->refcount = 1;
|
||||
EINA_REFCOUNT_INIT(async);
|
||||
async->thread = ecore_thread_run(_ethumb_client_exists_heavy,
|
||||
_ethumb_client_exists_end,
|
||||
_ethumb_client_exists_cancel,
|
||||
|
@ -2208,11 +2215,7 @@ ethumb_client_thumb_exists_cancel(Ethumb_Exists *exists)
|
|||
{
|
||||
Ethumb_Async_Exists *async = (Ethumb_Async_Exists*) exists;
|
||||
|
||||
async->refcount--;
|
||||
|
||||
if (async->refcount > 0) return ;
|
||||
|
||||
ecore_thread_cancel(async->thread);
|
||||
EINA_REFCOUNT_UNREF(async, _ethumb_async_cancel);
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
Loading…
Reference in New Issue