eldbus: do not release shared connections if connection is private.
authorCedric BAIL <cedric@osg.samsung.com>
Tue, 11 Aug 2015 14:13:07 +0000 (16:13 +0200)
committerCedric BAIL <cedric@osg.samsung.com>
Tue, 11 Aug 2015 15:43:02 +0000 (17:43 +0200)
Reviewers: cedric

Subscribers: cedric, seoz

Differential Revision: https://phab.enlightenment.org/D2935

Signed-off-by: Cedric BAIL <cedric@osg.samsung.com>
src/lib/eldbus/eldbus_core.c
src/lib/eldbus/eldbus_private_types.h

index 48ea7c0..1e4fde5 100644 (file)
@@ -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);
index 8ebe682..7af9426 100644 (file)
@@ -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