Change 'disable' method logic
authorJiwan Kim <ji-wan.kim@samsung.com>
Wed, 15 Feb 2017 02:07:06 +0000 (11:07 +0900)
committersaerome.kim <saerome.kim@samsung.com>
Thu, 11 May 2017 09:10:26 +0000 (18:10 +0900)
- If 'disable' method called,
  daemon terminates itself.
- Fix unexpected related crash issue related.

Change-Id: I0207e7466f99cc93fb9389c4b572158f9eb392d2
Signed-off-by: Jiwan Kim <ji-wan.kim@samsung.com>
zigbee-daemon/zigbee-interface/src/zigbee_service_dbus_interface.c
zigbee-daemon/zigbee-lib/include/zblib_plugin.h
zigbee-daemon/zigbee-lib/src/zblib_driver.c
zigbee-daemon/zigbee-lib/src/zblib_plugin.c

index b7a6016..121d6dc 100644 (file)
@@ -61,10 +61,16 @@ static gboolean on_manager_disable(ZigbeeManager *zigbee_mgr,
        GDBusMethodInvocation *invocation,
        gpointer user_data)
 {
+       ZigBeeServiceInterface *service_interface = (ZigBeeServiceInterface *)user_data;
+       ZigBeeService *service = zblib_service_interface_ref_service(service_interface);
+
        NOT_USED(user_data);
 
        zigbee_manager_complete_disable(zigbee_mgr, invocation, TRUE);
 
+       if (service)
+               zblib_service_exit(service);
+
        return TRUE;
 }
 
index bf12e14..c901a96 100644 (file)
@@ -43,6 +43,7 @@ ZigBeeService *zblib_plugin_ref_service(ZigBeePlugin *plugin);
 
 ZigBeeDriver *zblib_plugin_ref_driver(ZigBeePlugin *plugin, ZblibDriverType_e driver_type);
 void zblib_plugin_link_driver(ZigBeePlugin *plugin, ZigBeeDriver *driver);
+void zblib_plugin_unlink_driver(ZigBeePlugin *plugin, ZblibDriverType_e driver_type);
 
 gboolean zblib_plugin_dispatch_request(ZigBeePlugin *plugin,
        guint request_id);
index 1389aaf..5032997 100644 (file)
@@ -63,7 +63,7 @@ void zblib_driver_free(ZigBeeDriver *driver)
        if (driver->free_hook_fn)
                driver->free_hook_fn(driver);
 
-       Z_LOGI("Freeing Driver - Name [%p]", driver->driver_name);
+       Z_LOGI("Freeing Driver[%p] - Name [%s]", driver, driver->driver_name);
 
        /* Free driver memory */
        g_free(driver->driver_name);
@@ -134,8 +134,9 @@ gboolean zblib_driver_set_free_hook(ZigBeeDriver *driver,
 
 ZblibDriverType_e zblib_driver_ref_driver_type(ZigBeeDriver *driver)
 {
-       zblib_check_null_ret_error("driver",
-               driver, ZBLIB_DRIVER_TYPE_NONE);
+       if (NULL == driver) {
+               return ZBLIB_DRIVER_TYPE_NONE;
+       }
 
        return driver->driver_type;
 }
index 9ec5ae6..d8ce3a9 100644 (file)
@@ -149,6 +149,29 @@ void zblib_plugin_link_driver(ZigBeePlugin *plugin, ZigBeeDriver *driver)
        Z_LOGD("Driver appended into plugin [%s]", plugin->plugin_name);
 }
 
+void zblib_plugin_unlink_driver(ZigBeePlugin *plugin, ZblibDriverType_e driver_type)
+{
+       ZblibDriverType_e _driver_type;
+       GSList *list = NULL;
+
+       zblib_check_null_ret("plugin", plugin);
+
+       list = plugin->driver_list;
+       while (list) {
+               /* Fetch driver type of driver */
+               _driver_type = zblib_driver_ref_driver_type((ZigBeeDriver *)(list->data));
+               if (_driver_type == driver_type) {
+                       /* Driver found */
+                       Z_LOGD("Driver[%p] removed from plugin", list->data);
+                       list->data = NULL;
+                       break;
+               }
+
+               /* Move to next driver */
+               list = g_slist_next(list);
+       }
+}
+
 gboolean zblib_plugin_dispatch_request(ZigBeePlugin *plugin,
        guint request_id)
 {