Remove duplicate codes for releasing listener 62/211662/4
authorjiyong.min <jiyong.min@samsung.com>
Thu, 8 Aug 2019 01:52:15 +0000 (10:52 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Fri, 9 Aug 2019 01:48:04 +0000 (10:48 +0900)
Change-Id: Ib25f7e12c768a9655d7c44b7abbdf9b3429ee1d4

src/media_controller_ipc.c

index 03b5642..b00b992 100644 (file)
@@ -50,6 +50,14 @@ static char *__make_key_for_map(const char *main_key, const char *sub_key)
        return g_strdup_printf("%s.%s", main_key, sub_key);
 }
 
+static gint __find_listener_by_key(gconstpointer data, gconstpointer user_data)
+{
+       mc_ipc_listener_s *listener = (mc_ipc_listener_s *)data;
+       char *key = (char *)user_data;
+
+       return (!listener || g_strcmp0(listener->key, key)) ? 1 : 0;
+}
+
 static void __mc_ipc_signal_cb(GDBusConnection *connection,
                                                                        const gchar *sender_name,
                                                                        const gchar *object_path,
@@ -238,30 +246,23 @@ int mc_ipc_register_listener(GList **listener_list, GDBusConnection *connection,
 
 int mc_ipc_unregister_listener(GList **listener_list, const char *interface_name, const char *signal_name)
 {
-       int i = 0;
-       int list_len = 0;
+       GList *element = NULL;
        char *key = NULL;
 
-       mc_retvm_if(listener_list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL");
-       mc_retvm_if(interface_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "interface_name is NULL");
-       mc_retvm_if(signal_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "signal_name is NULL");
+       mc_retvm_if(!listener_list, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL");
+       mc_retvm_if(!interface_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "interface_name is NULL");
+       mc_retvm_if(!signal_name, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "signal_name is NULL");
 
        key = __make_key_for_map(interface_name, signal_name);
-       mc_retvm_if(key == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail to get key");
+       mc_retvm_if(!key, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail to get key");
 
-       list_len = g_list_length(*listener_list) - 1;
-       for (i = list_len; i >= 0; i--) {
-               mc_ipc_listener_s *listener = (mc_ipc_listener_s *)g_list_nth_data(*listener_list, i);
-               if (listener && !g_strcmp0(listener->key, key)) {
-                       _mc_ipc_signal_unsubscribe(listener->dbus_conn, listener->handler);
-                       MC_SAFE_FREE(listener->interface_name);
-                       MC_SAFE_FREE(listener->signal_name);
-                       MC_SAFE_G_FREE(listener->key);
-                       (*listener_list) = g_list_remove(*listener_list, listener);
-                       MC_SAFE_FREE(listener);
-                       mc_debug("listener[%s.%s] is unregistered. listener_cnt[%d]", interface_name, signal_name, g_list_length(*listener_list));
-                       break;
-               }
+       element = g_list_find_custom(*listener_list, (gconstpointer)key, __find_listener_by_key);
+       if (element) {
+               (*listener_list) = g_list_remove_link(*listener_list, element);
+               __mc_destroy_listener(element->data);
+               g_list_free (element);
+
+               mc_debug("listener[%s.%s] is unregistered. listener_cnt[%d]", interface_name, signal_name, g_list_length(*listener_list));
        }
 
        MC_SAFE_G_FREE(key);