Fix FC on timeout callback (device_info/platform_info/find_resource)
authorsung.goo.kim <sung.goo.kim@samsung.com>
Tue, 15 Dec 2015 06:28:12 +0000 (15:28 +0900)
committerYoungjae Shin <yj99.shin@samsung.com>
Wed, 16 Dec 2015 07:40:27 +0000 (16:40 +0900)
Change-Id: I8d1e2110158cabfdb2cb2a81a31f3edd76f90b64

lib/icl-device.c
lib/icl-remote-resource.c

index 4a12c24..5d2124d 100644 (file)
@@ -44,6 +44,7 @@
 
 
 typedef struct {
+       bool found;
        iotcon_device_info_cb cb;
        void *user_data;
        unsigned int id;
@@ -51,6 +52,7 @@ typedef struct {
 } icl_device_info_s;
 
 typedef struct {
+       bool found;
        iotcon_platform_info_cb cb;
        void *user_data;
        unsigned int id;
@@ -98,8 +100,7 @@ static void _icl_device_info_cb(GDBusConnection *connection,
        icl_device_info_s *cb_container = user_data;
        iotcon_device_info_cb cb = cb_container->cb;
 
-       if (cb_container->timeout_id)
-               cb_container->timeout_id = 0;
+       cb_container->found = true;
 
        g_variant_get(parameters, "(&s&s&s&s&s)", &uri_path, &info.device_name,
                        &info.spec_ver, &info.device_id, &info.data_model_ver);
@@ -121,8 +122,9 @@ static gboolean _icl_timeout_get_device_info(gpointer p)
                return G_SOURCE_REMOVE;
        }
 
-       if (cb_container->timeout_id && cb_container->cb)
+       if (false == cb_container->found && cb_container->cb)
                cb_container->cb(&info, IOTCON_ERROR_TIMEOUT, cb_container->user_data);
+       cb_container->timeout_id = 0;
 
        icl_dbus_unsubscribe_signal(cb_container->id);
        cb_container->id = 0;
@@ -130,6 +132,14 @@ static gboolean _icl_timeout_get_device_info(gpointer p)
        return G_SOURCE_REMOVE;
 }
 
+static void _icl_device_info_conn_cleanup(icl_device_info_s *cb_container)
+{
+       RET_IF(NULL == cb_container);
+       if (cb_container->timeout_id)
+               g_source_remove(cb_container->timeout_id);
+       free(cb_container);
+}
+
 API int iotcon_get_device_info(const char *host_address,
                iotcon_connectivity_type_e connectivity_type,
                iotcon_device_info_cb cb,
@@ -179,8 +189,8 @@ API int iotcon_get_device_info(const char *host_address,
        cb_container->cb = cb;
        cb_container->user_data = user_data;
 
-       sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
-                       _icl_device_info_cb);
+       sub_id = icl_dbus_subscribe_signal(signal_name, cb_container,
+                       _icl_device_info_conn_cleanup, _icl_device_info_cb);
        if (0 == sub_id) {
                ERR("icl_dbus_subscribe_signal() Fail");
                free(cb_container);
@@ -257,8 +267,7 @@ static void _icl_platform_info_cb(GDBusConnection *connection,
        icl_platform_info_s *cb_container = user_data;
        iotcon_platform_info_cb cb = cb_container->cb;
 
-       if (cb_container->timeout_id)
-               cb_container->timeout_id = 0;
+       cb_container->found = true;
 
        g_variant_get(parameters, "(&s&s&s&s&s&s&s&s&s&s&s&s)",
                        &uri_path,
@@ -301,8 +310,9 @@ static gboolean _icl_timeout_get_platform_info(gpointer p)
                return G_SOURCE_REMOVE;
        }
 
-       if (cb_container->timeout_id && cb_container->cb)
+       if (false == cb_container->found && cb_container->cb)
                cb_container->cb(&info, IOTCON_ERROR_TIMEOUT, cb_container->user_data);
+       cb_container->timeout_id = 0;
 
        icl_dbus_unsubscribe_signal(cb_container->id);
        cb_container->id = 0;
@@ -310,6 +320,16 @@ static gboolean _icl_timeout_get_platform_info(gpointer p)
        return G_SOURCE_REMOVE;
 }
 
+static void _icl_platform_info_conn_cleanup(icl_platform_info_s *cb_container)
+{
+       RET_IF(NULL == cb_container);
+
+       if (cb_container->timeout_id)
+               g_source_remove(cb_container->timeout_id);
+
+       free(cb_container);
+}
+
 API int iotcon_get_platform_info(const char *host_address,
                iotcon_connectivity_type_e connectivity_type,
                iotcon_platform_info_cb cb,
@@ -359,8 +379,8 @@ API int iotcon_get_platform_info(const char *host_address,
        cb_container->cb = cb;
        cb_container->user_data = user_data;
 
-       sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
-                       _icl_platform_info_cb);
+       sub_id = icl_dbus_subscribe_signal(signal_name, cb_container,
+                       _icl_platform_info_conn_cleanup, _icl_platform_info_cb);
        if (0 == sub_id) {
                ERR("icl_dbus_subscribe_signal() Fail");
                free(cb_container);
index 0f7d8fb..2d9e1fc 100644 (file)
@@ -33,6 +33,7 @@
 #define ICL_REMOTE_RESOURCE_MAX_TIME_INTERVAL 3600 /* 60 min */
 
 typedef struct {
+       bool found;
        iotcon_found_resource_cb cb;
        void *user_data;
        unsigned int id;
@@ -58,8 +59,7 @@ static void _icl_found_resource_cb(GDBusConnection *connection,
        icl_found_resource_s *cb_container = user_data;
        iotcon_found_resource_cb cb = cb_container->cb;
 
-       if (cb_container->timeout_id)
-               cb_container->timeout_id = 0;
+       cb_container->found = true;
 
        g_variant_get(parameters, "(vi)", &payload, &connectivity_type);
 
@@ -84,8 +84,9 @@ static gboolean _icl_timeout_find_resource(gpointer p)
                return G_SOURCE_REMOVE;
        }
 
-       if (cb_container->timeout_id && cb_container->cb)
+       if (false == cb_container->found && cb_container->cb)
                cb_container->cb(NULL, IOTCON_ERROR_TIMEOUT, cb_container->user_data);
+       cb_container->timeout_id = 0;
 
        icl_dbus_unsubscribe_signal(cb_container->id);
        cb_container->id = 0;
@@ -93,6 +94,14 @@ static gboolean _icl_timeout_find_resource(gpointer p)
        return G_SOURCE_REMOVE;
 }
 
+static void _icl_find_resource_conn_cleanup(icl_found_resource_s *cb_container)
+{
+       RET_IF(NULL == cb_container);
+       if (cb_container->timeout_id)
+               g_source_remove(cb_container->timeout_id);
+       free(cb_container);
+}
+
 
 /* The length of resource_type should be less than or equal to 61.
  * If resource_type is NULL, then All resources in host are discovered. */
@@ -153,8 +162,8 @@ API int iotcon_find_resource(const char *host_address,
        cb_container->cb = cb;
        cb_container->user_data = user_data;
 
-       sub_id = icl_dbus_subscribe_signal(signal_name, cb_container, free,
-                       _icl_found_resource_cb);
+       sub_id = icl_dbus_subscribe_signal(signal_name, cb_container,
+                       _icl_find_resource_conn_cleanup, _icl_found_resource_cb);
        if (0 == sub_id) {
                ERR("icl_dbus_subscribe_signal() Fail");
                return IOTCON_ERROR_DBUS;