From 89b6ee058e3139f35405564920df4b93a23ee228 Mon Sep 17 00:00:00 2001 From: Cedric BAIL Date: Tue, 11 Aug 2015 16:13:07 +0200 Subject: [PATCH] eldbus: do not release shared connections if connection is private. Reviewers: cedric Subscribers: cedric, seoz Differential Revision: https://phab.enlightenment.org/D2935 Signed-off-by: Cedric BAIL --- src/lib/eldbus/eldbus_core.c | 13 +++++++------ src/lib/eldbus/eldbus_private_types.h | 1 + 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/lib/eldbus/eldbus_core.c b/src/lib/eldbus/eldbus_core.c index 48ea7c01e9..1e4fde5d5b 100644 --- a/src/lib/eldbus/eldbus_core.c +++ b/src/lib/eldbus/eldbus_core.c @@ -978,7 +978,7 @@ _disconnected(void *data, const Eldbus_Message *msg EINA_UNUSED) /* Param address is only used for ELDBUS_CONNECTION_TYPE_ADDRESS type */ static Eldbus_Connection * -_connection_get(Eldbus_Connection_Type type, const char *address) +_connection_get(Eldbus_Connection_Type type, const char *address, Eina_Bool shared) { Eldbus_Connection *conn; DBusError err; @@ -1019,6 +1019,7 @@ _connection_get(Eldbus_Connection_Type type, const char *address) conn->type = type; conn->refcount = 1; + conn->shared = !!shared; EINA_MAGIC_SET(conn, ELDBUS_CONNECTION_MAGIC); conn->names = eina_hash_string_superfast_new(NULL); eldbus_connection_setup(conn); @@ -1036,7 +1037,7 @@ EAPI Eldbus_Connection * eldbus_private_connection_get(Eldbus_Connection_Type type) { DBG("Getting private connection with type %d", type); - return _connection_get(type, NULL); + return _connection_get(type, NULL, EINA_FALSE); } EAPI Eldbus_Connection * @@ -1063,7 +1064,7 @@ eldbus_connection_get(Eldbus_Connection_Type type) return eldbus_connection_ref(conn); } - conn = _connection_get(type, NULL); + conn = _connection_get(type, NULL, EINA_TRUE); EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL); shared_connections[type - 1] = conn; @@ -1094,7 +1095,7 @@ eldbus_address_connection_get(const char *address) return eldbus_connection_ref(conn); } - conn = _connection_get(ELDBUS_CONNECTION_TYPE_ADDRESS, address); + conn = _connection_get(ELDBUS_CONNECTION_TYPE_ADDRESS, address, EINA_TRUE); EINA_SAFETY_ON_NULL_RETURN_VAL(conn, NULL); eina_hash_add(address_connections, address, conn); @@ -1105,7 +1106,7 @@ EAPI Eldbus_Connection * eldbus_private_address_connection_get(const char *address) { DBG("Getting private connection with address %s", address); - return _connection_get(ELDBUS_CONNECTION_TYPE_ADDRESS, address); + return _connection_get(ELDBUS_CONNECTION_TYPE_ADDRESS, address, EINA_FALSE); } EAPI Eldbus_Connection * @@ -1229,7 +1230,7 @@ _eldbus_connection_free(Eldbus_Connection *conn) eldbus_data_del_all(&conn->data); if (conn->idler) ecore_idler_del(conn->idler); - if (conn->type) + if (conn->type && conn->shared) { if (conn->type == ELDBUS_CONNECTION_TYPE_ADDRESS) eina_hash_del_by_data(address_connections, conn); diff --git a/src/lib/eldbus/eldbus_private_types.h b/src/lib/eldbus/eldbus_private_types.h index 8ebe682544..7af94263db 100644 --- a/src/lib/eldbus/eldbus_private_types.h +++ b/src/lib/eldbus/eldbus_private_types.h @@ -58,6 +58,7 @@ struct _Eldbus_Connection Eldbus_Connection_Context_Event event_handlers[ELDBUS_CONNECTION_EVENT_LAST]; Eina_Inlist *root_objs;//service_object Eldbus_Proxy *fdo_proxy; + Eina_Bool shared : 1; /* Indicate if connection can be shared */ }; struct _Eldbus_Object