Crash issue fix. Fix wrong listener list management and remove empty listener 89/151589/2
authorHaejeong Kim <backto.kim@samsung.com>
Thu, 21 Sep 2017 08:16:37 +0000 (17:16 +0900)
committerHaejeong Kim <backto.kim@samsung.com>
Thu, 21 Sep 2017 08:17:33 +0000 (17:17 +0900)
Change-Id: I6fa61669504dfc61690a1c88cc74b7f8a864e30e

include/media_controller_private.h
packaging/capi-media-controller.spec
src/media_controller_client.c
src/media_controller_ipc.c
src/media_controller_server.c

index d28007df39c5e994150987cab23fe3100db9df46..b42019dc7d8d819512b818d5e1be6649ee583711 100755 (executable)
@@ -238,9 +238,9 @@ int mc_util_get_command_availabe(const char *name, const char *command_type, con
 /* for d-bus IPC */
 int mc_ipc_get_dbus_connection(GDBusConnection **conn, int *dref_count);
 int mc_ipc_unref_dbus_connection(GDBusConnection *conn, int *dref_count);
-int mc_ipc_register_listener(GList *manage_list, GDBusConnection *connection, const char *interface_name, const char *signal_name, mc_signal_received_cb callback, void *user_data);
-int mc_ipc_unregister_listener(GList *manage_list, GDBusConnection *connection, const char *interface_name, const char *signal_name);
-int mc_ipc_unregister_all_listener(GList *manage_list, GDBusConnection *connection);
+int mc_ipc_register_listener(GList **manage_list, GDBusConnection *connection, const char *interface_name, const char *signal_name, mc_signal_received_cb callback, void *user_data);
+int mc_ipc_unregister_listener(GList **manage_list, GDBusConnection *connection, const char *interface_name, const char *signal_name);
+int mc_ipc_unregister_all_listener(GList **manage_list, GDBusConnection *connection);
 int mc_ipc_send_message(GDBusConnection *connection, const char *dbus_name, const char *interface_name, const char* signal_name, const char* message, int flags);
 int mc_ipc_send_message_to_server(mc_msg_type_e msg_type, const int type, const char *request_msg);
 int mc_ipc_service_connect(const int type);
index c690a38d801537f5544fae5928204555a529c9f7..a23d8cf34733aba74590c6669d2543efc46d92e8 100755 (executable)
@@ -1,6 +1,6 @@
 Name:       capi-media-controller
 Summary:    A media controller library in Tizen Native API
-Version:    0.1.48
+Version:    0.1.49
 Release:    1
 Group:      Multimedia/API
 License:    Apache-2.0
index d5742ddaa652ad6a90a3fc5ffb5480fffbda19cc..edbd83ef8d0c90fa5fd1f700dfd62d2eecc40a1b 100755 (executable)
@@ -186,13 +186,6 @@ static int __mc_client_create(media_controller_client_s **mc_client)
                goto Error;
        }
 
-       _client->listeners = g_list_alloc();
-       if (_client->listeners == NULL) {
-               ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
-               mc_error("Error allocation list %d", ret);
-               goto Error;
-       }
-
        *mc_client = _client;
 
        return MEDIA_CONTROLLER_ERROR_NONE;
@@ -203,9 +196,6 @@ Error:
        if (_client->db_handle)
                mc_db_disconnect(_client->db_handle);
 
-       if (_client->listeners)
-               g_list_free(_client->listeners);
-
        MC_SAFE_FREE(_client->client_name);
        MC_SAFE_FREE(_client);
 
@@ -249,7 +239,7 @@ static int __mc_client_register_filter_listener(media_controller_client_s *mc_cl
        ret = mc_util_make_filter_interface_name(MC_DBUS_UPDATE_INTERFACE, server_name, &filter_interface_name);
        mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "Fail mc_util_make_filter_interface_name");
 
-       ret = mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, filter_interface_name, signal_name, callback, user_data);
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, filter_interface_name, signal_name, callback, user_data);
        if (ret == MEDIA_CONTROLLER_ERROR_NONE)
                *filter_list = g_list_append(*filter_list, strdup(filter_interface_name));
 
@@ -284,7 +274,7 @@ static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_
                }
 
                /*Unregister listener*/
-               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, filter_interface_name, signal_name);
+               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, filter_interface_name, signal_name);
                if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                        MC_SAFE_FREE(filter_interface_name);
                        return ret;
@@ -316,7 +306,7 @@ static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_
                                mc_debug("[%d][%s]", idx, interface_name);
 
                                /*Unregister listener*/
-                               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, interface_name, signal_name);
+                               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, interface_name, signal_name);
                                if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                                        mc_error("Fail mc_ipc_unregister_listener");
 
@@ -383,7 +373,7 @@ int mc_client_set_server_update_cb(mc_client_h client, mc_server_state_updated_c
        mc_client->server_state_cb.callback = callback;
        mc_client->server_state_cb.user_data = user_data;
 
-       ret = mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE,
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE,
                                                __client_server_cb, (void *)&(mc_client->server_state_cb));
 
        return ret;
@@ -396,7 +386,7 @@ int mc_client_unset_server_update_cb(mc_client_h client)
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
 
        ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->server_state_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
 
@@ -419,7 +409,7 @@ int mc_client_set_playback_update_cb(mc_client_h client, mc_playback_updated_cb
        mc_client->playback_cb.callback = callback;
        mc_client->playback_cb.user_data = user_data;
 
-       ret = mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK,
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK,
                                                        __client_playback_cb, (void *)&(mc_client->playback_cb));
 
        return ret;
@@ -432,7 +422,7 @@ int mc_client_unset_playback_update_cb(mc_client_h client)
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
 
        ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->playback_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
 
@@ -455,7 +445,7 @@ int mc_client_set_metadata_update_cb(mc_client_h client, mc_metadata_updated_cb
        mc_client->metadata_cb.callback = callback;
        mc_client->metadata_cb.user_data = user_data;
 
-       ret = mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA,
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA,
                                                        __client_metadata_cb, (void *)(mc_client));
 
        return ret;
@@ -468,7 +458,7 @@ int mc_client_unset_metadata_update_cb(mc_client_h client)
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA);
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA);
 
        ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->metadata_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_METADATA);
 
@@ -491,7 +481,7 @@ int mc_client_set_shuffle_mode_update_cb(mc_client_h client, mc_shuffle_mode_cha
        mc_client->shuffle_cb.callback = callback;
        mc_client->shuffle_cb.user_data = user_data;
 
-       ret = mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE,
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE,
                                                        __client_shuffle_cb, (void *)&(mc_client->shuffle_cb));
 
        return ret;
@@ -504,7 +494,7 @@ int mc_client_unset_shuffle_mode_update_cb(mc_client_h client)
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
 
        ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->shuffle_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
 
@@ -528,7 +518,7 @@ int mc_client_set_repeat_mode_update_cb(mc_client_h client, mc_repeat_mode_chang
        mc_client->repeat_cb.callback = callback;
        mc_client->repeat_cb.user_data = user_data;
 
-       ret = mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT,
+       ret = mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT,
                                                        __client_repeat_cb, (void *)&(mc_client->repeat_cb));
 
        return ret;
@@ -541,7 +531,7 @@ int mc_client_unset_repeat_mode_update_cb(mc_client_h client)
 
        mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
+       ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
 
        ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->repeat_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
 
@@ -564,35 +554,35 @@ int mc_client_subscribe(mc_client_h client, const mc_subscription_type_e subscri
        case MC_SUBSCRIPTION_TYPE_SERVER_STATE:
                mc_retvm_if(mc_client->server_state_cb.callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid callback");
 
-               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
+               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_SERVER_STATE);
                ret = __mc_client_register_filter_listener(mc_client, &mc_client->server_state_cb.filter_list, server_name, MC_DBUS_SIGNAL_NAME_SERVER_STATE,
                                        __client_server_cb, (void *)&(mc_client->server_state_cb));
                break;
        case MC_SUBSCRIPTION_TYPE_PLAYBACK:
                mc_retvm_if(mc_client->playback_cb.callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid callback");
 
-               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
+               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAY_BACK);
                ret = __mc_client_register_filter_listener(mc_client, &mc_client->playback_cb.filter_list, server_name, MC_DBUS_SIGNAL_NAME_PLAY_BACK,
                                        __client_playback_cb, (void *)&(mc_client->playback_cb));
                break;
        case MC_SUBSCRIPTION_TYPE_METADATA:
                mc_retvm_if(mc_client->metadata_cb.callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid callback");
 
-               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA);
+               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_METADATA);
                ret = __mc_client_register_filter_listener(mc_client, &mc_client->metadata_cb.filter_list, server_name, MC_DBUS_SIGNAL_NAME_METADATA,
                                        __client_metadata_cb, (void *)(mc_client));
                break;
        case MC_SUBSCRIPTION_TYPE_SHUFFLE_MODE:
                mc_retvm_if(mc_client->shuffle_cb.callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid callback");
 
-               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
+               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE);
                ret = __mc_client_register_filter_listener(mc_client, &mc_client->shuffle_cb.filter_list, server_name, MC_DBUS_SIGNAL_NAME_PLAYBACK_SHUFFLE,
                                        __client_shuffle_cb, (void *)&(mc_client->shuffle_cb));
                break;
        case MC_SUBSCRIPTION_TYPE_REPEAT_MODE:
                mc_retvm_if(mc_client->repeat_cb.callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid callback");
 
-               ret = mc_ipc_unregister_listener(mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
+               ret = mc_ipc_unregister_listener(&mc_client->listeners, mc_client->dconn, MC_DBUS_UPDATE_INTERFACE, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
                ret = __mc_client_register_filter_listener(mc_client, &mc_client->repeat_cb.filter_list, server_name, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT,
                                        __client_repeat_cb, (void *)&(mc_client->repeat_cb));
                break;
@@ -1018,7 +1008,7 @@ int mc_client_send_custom_command(mc_client_h client, const char *server_name, c
                char *interface_name_for_reply = mc_util_get_interface_name(MC_CLIENT, mc_client->client_name);
                mc_client->reply_cb.callback = callback;
                mc_client->reply_cb.user_data = user_data;
-               mc_ipc_register_listener(mc_client->listeners, mc_client->dconn, interface_name_for_reply, MC_DBUS_SIGNAL_NAME_CMD_REPLY, __client_reply_cb, (void *)&(mc_client->reply_cb));
+               mc_ipc_register_listener(&mc_client->listeners, mc_client->dconn, interface_name_for_reply, MC_DBUS_SIGNAL_NAME_CMD_REPLY, __client_reply_cb, (void *)&(mc_client->reply_cb));
                MC_SAFE_FREE(interface_name_for_reply);
        }
 
@@ -1065,7 +1055,7 @@ int mc_client_destroy(mc_client_h client)
        ret = __mc_client_unregister_filter_listener(mc_client, &mc_client->repeat_cb.filter_list, NULL, MC_DBUS_SIGNAL_NAME_PLAYBACK_REPEAT);
 
        /*Unregister all listener*/
-       ret = mc_ipc_unregister_all_listener(mc_client->listeners, mc_client->dconn);
+       ret = mc_ipc_unregister_all_listener(&mc_client->listeners, mc_client->dconn);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                mc_error("Error mc_ipc_unregister_all_listener [%d]", ret);
 
index 57a5a3d183c676cbe3b60f0a60c45c6f9ca72b98..09ed146170f5d6141a7700b5a4b51381fc5c1a48 100755 (executable)
@@ -165,7 +165,7 @@ int mc_ipc_unref_dbus_connection(GDBusConnection *connection, int *dref_count)
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
-int mc_ipc_register_listener(GList *listener_list, GDBusConnection *connection, const char *interface_name, const char *signal_name, mc_signal_received_cb callback, void *user_data)
+int mc_ipc_register_listener(GList **listener_list, GDBusConnection *connection, const char *interface_name, const char *signal_name, mc_signal_received_cb callback, void *user_data)
 {
        char *key = NULL;
        guint handler = 0;
@@ -182,7 +182,7 @@ int mc_ipc_register_listener(GList *listener_list, GDBusConnection *connection,
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
        }
 
-       if (_mc_ipc_is_listener_duplicated(listener_list, key)) {
+       if (_mc_ipc_is_listener_duplicated(*listener_list, key)) {
                mc_error("listener is duplicated");
 
                MC_SAFE_G_FREE(key);
@@ -196,7 +196,7 @@ int mc_ipc_register_listener(GList *listener_list, GDBusConnection *connection,
                return MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
        }
 
-       handler = _mc_ipc_signal_subscribe(connection, interface_name, signal_name, listener_list);
+       handler = _mc_ipc_signal_subscribe(connection, interface_name, signal_name, *listener_list);
 
        listener->dbus_conn = connection;
        listener->interface_name = strdup(interface_name);
@@ -206,16 +206,17 @@ int mc_ipc_register_listener(GList *listener_list, GDBusConnection *connection,
        listener->handler = handler;
        listener->key = key;
 
-       (listener_list) = g_list_append((listener_list), listener);
+       (*listener_list) = g_list_append(*listener_list, listener);
 
-       mc_debug("listener[%s] is registered. listener_cnt[%d]", key, g_list_length(listener_list));
+       mc_debug("listener[%s] is registered. listener_cnt[%d]", key, g_list_length(*listener_list));
 
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
-int mc_ipc_unregister_listener(GList *listener_list, GDBusConnection *connection, const char *interface_name, const char *signal_name)
+int mc_ipc_unregister_listener(GList **listener_list, GDBusConnection *connection, const char *interface_name, const char *signal_name)
 {
        int i = 0;
+       int list_len = 0;
        char *key = NULL;
 
        mc_retvm_if(listener_list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL");
@@ -229,16 +230,17 @@ int mc_ipc_unregister_listener(GList *listener_list, GDBusConnection *connection
                return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION;
        }
 
-       for (i = g_list_length(listener_list) - 1; i >= 0; i--) {
-               mc_ipc_listener_s *listener = (mc_ipc_listener_s *)g_list_nth_data(listener_list, i);
+       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(connection, 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);
+                       (*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));
+                       mc_debug("listener[%s.%s] is unregistered. listener_cnt[%d]", interface_name, signal_name, g_list_length(*listener_list));
                        break;
                }
        }
@@ -248,22 +250,25 @@ int mc_ipc_unregister_listener(GList *listener_list, GDBusConnection *connection
        return MEDIA_CONTROLLER_ERROR_NONE;
 }
 
-int mc_ipc_unregister_all_listener(GList *listener_list, GDBusConnection *connection)
+int mc_ipc_unregister_all_listener(GList **listener_list, GDBusConnection *connection)
 {
        int i = 0;
+       int list_len = 0;
 
        mc_retvm_if(connection == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "connection is NULL");
        mc_retvm_if(listener_list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL");
 
-       for (i = g_list_length(listener_list) - 1; i >= 0; i--) {
-               mc_ipc_listener_s *listener = (mc_ipc_listener_s *)g_list_nth_data(listener_list, i);
+       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) {
-                       mc_debug("listener[%s] is unregistered. listener_cnt[%d]", listener->key, g_list_length(listener_list));
+                       mc_debug("listener[%s] is unregistered. listener_cnt[%d]", listener->key, g_list_length(*listener_list));
                        _mc_ipc_signal_unsubscribe(connection, 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);
+                       (*listener_list) = g_list_remove(*listener_list, listener);
                        MC_SAFE_FREE(listener);
                }
        }
index 893aef33f1cd94cb38555f7693f0d7152fd099a4..b857a5cb0b564dc69ccf9e020a8a360ca8b42553 100755 (executable)
@@ -52,13 +52,6 @@ static int __mc_server_create(media_controller_server_s **mc_server)
                goto ERROR;
        }
 
-       _server->listeners = g_list_alloc();
-       if (_server->listeners == NULL) {
-               ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
-               mc_error("Error allocation list %d", ret);
-               goto ERROR;
-       }
-
        *mc_server = _server;
 
        return MEDIA_CONTROLLER_ERROR_NONE;
@@ -70,9 +63,6 @@ ERROR:
        if (_server->db_handle)
                mc_db_disconnect(_server->db_handle);
 
-       if (_server->listeners)
-               g_list_free(_server->listeners);
-
        MC_SAFE_FREE(_server->server_name);
        MC_SAFE_FREE(_server->metadata);
        MC_SAFE_FREE(_server);
@@ -447,7 +437,7 @@ int mc_server_set_playback_state_command_received_cb(mc_server_h server, mc_serv
        mc_server->playback_state_reciever.user_data = user_data;
 
        char *interface_name = mc_util_get_interface_name(MC_SERVER, mc_server->server_name);
-       ret = mc_ipc_register_listener(mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD, __server_playback_state_command_cb, (void *)&(mc_server->playback_state_reciever));
+       ret = mc_ipc_register_listener(&mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD, __server_playback_state_command_cb, (void *)&(mc_server->playback_state_reciever));
 
        MC_SAFE_FREE(interface_name);
 
@@ -462,7 +452,7 @@ int mc_server_unset_playback_state_command_received_cb(mc_server_h server)
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        char *interface_name = mc_util_get_interface_name(MC_SERVER, mc_server->server_name);
-       ret = mc_ipc_unregister_listener(mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD);
+       ret = mc_ipc_unregister_listener(&mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_PLAYBACK_STATE_CMD);
 
        mc_server->playback_state_reciever.callback = NULL;
        mc_server->playback_state_reciever.user_data = NULL;
@@ -484,7 +474,7 @@ int mc_server_set_custom_command_received_cb(mc_server_h server, mc_server_custo
        mc_server->custom_cmd_reciever.user_data = user_data;
 
        char *interface_name = mc_util_get_interface_name(MC_SERVER, mc_server->server_name);
-       ret = mc_ipc_register_listener(mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_CUSTOM_CMD, __server_custom_command_cb, (void *)&(mc_server->custom_cmd_reciever));
+       ret = mc_ipc_register_listener(&mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_CUSTOM_CMD, __server_custom_command_cb, (void *)&(mc_server->custom_cmd_reciever));
 
        MC_SAFE_FREE(interface_name);
 
@@ -499,7 +489,7 @@ int mc_server_unset_custom_command_received_cb(mc_server_h server)
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
        char *interface_name = mc_util_get_interface_name(MC_SERVER, mc_server->server_name);
-       ret = mc_ipc_unregister_listener(mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_CUSTOM_CMD);
+       ret = mc_ipc_unregister_listener(&mc_server->listeners, mc_server->dconn, interface_name, MC_DBUS_SIGNAL_NAME_CUSTOM_CMD);
 
        mc_server->custom_cmd_reciever.callback = NULL;
        mc_server->custom_cmd_reciever.user_data = NULL;
@@ -629,7 +619,7 @@ int mc_server_destroy(mc_server_h server)
 
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       ret = mc_ipc_unregister_all_listener(mc_server->listeners, mc_server->dconn);
+       ret = mc_ipc_unregister_all_listener(&mc_server->listeners, mc_server->dconn);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                mc_error("fail mc_ipc_unregister_all_listener [%d]", ret);