From: jiyong.min Date: Thu, 28 Nov 2019 06:10:50 +0000 (+0900) Subject: Code refactoring for using GList X-Git-Tag: accepted/tizen/unified/20191227.142816^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=422e5cee300309be9055a93d4f3037019505c6b0;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Code refactoring for using GList - The loop to find listener over the GList are replaced to 'g_list_find_custom()'. - The 'g_list_length()' is not fast because GList does not keep track of the number of items. To reduce the 'g_list_length()' call, using index for a loop over the list are replaced to using iterator. To visit all elements in the list, use a loop over the list: GList *l; for (l = list; l != NULL; l = l->next) { // do something with l->data } reference: https://developer.gnome.org/glib/stable/glib-Doubly-Linked-Lists.html Change-Id: Ic916d5ef9157b3c7574631b975351507f860fcb5 --- diff --git a/src/media_controller_client.c b/src/media_controller_client.c index 0c98b32..9d246e8 100644 --- a/src/media_controller_client.c +++ b/src/media_controller_client.c @@ -567,15 +567,12 @@ static gint __compare_filter(gconstpointer data, gconstpointer user_data) static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_client, GList **filter_list, const char *server_name, const char *signal_name) { int ret = MEDIA_CONTROLLER_ERROR_NONE; - GList *element = NULL; - char *_server_name = NULL; - unsigned int idx, filter_cnt = 0; + GList *found_item = NULL, *iter = NULL; mc_retvm_if(filter_list == NULL, MEDIA_CONTROLLER_ERROR_NONE, "[No-Error] No filter list to unset"); mc_retvm_if(!MC_STRING_VALID(signal_name), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid signal_name"); - filter_cnt = g_list_length(*filter_list); - mc_debug("signal [%s] cnt [%d]", signal_name, filter_cnt); + mc_debug("signal [%s] cnt [%d]", signal_name, g_list_length(*filter_list)); if (MC_STRING_VALID(server_name)) { /* Unregister filter */ @@ -584,20 +581,19 @@ static int __mc_client_unregister_filter_listener(media_controller_client_s *mc_ mc_error("Fail mc_ipc_unregister_filter_listener"); /* Remove from filter_list */ - element = g_list_find_custom(*filter_list, server_name, __compare_filter); - if (element) { - (*filter_list) = g_list_remove_link(*filter_list, element); - g_list_free_full(element, g_free); - } + found_item = g_list_find_custom(*filter_list, server_name, __compare_filter); + mc_retvm_if(!found_item, MEDIA_CONTROLLER_ERROR_NONE, "[No-Error] Listener already unregistered"); + + (*filter_list) = g_list_remove_link(*filter_list, found_item); + g_list_free_full(found_item, g_free); mc_debug("filter[%s.%s] is unregistered. Remaining filters: [%d]", server_name, signal_name, g_list_length(*filter_list)); } else { /* Unregister all filters */ - for (idx = 0; idx < filter_cnt; idx++) { - _server_name = g_list_nth_data(*filter_list, idx); - mc_debug("[%d][%s]", idx, _server_name); + for (iter = *filter_list; iter; iter = iter->next) { + mc_debug("filter[%s.%s]", (char *)(iter->data), signal_name); - ret = mc_ipc_unregister_filter_listener(&mc_client->listeners, _server_name, signal_name); + ret = mc_ipc_unregister_filter_listener(&mc_client->listeners, (char *)(iter->data), signal_name); if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Fail mc_ipc_unregister_filter_listener"); } @@ -975,29 +971,20 @@ int mc_client_foreach_server_subscribed(mc_client_h client, const mc_subscriptio { int ret = MEDIA_CONTROLLER_ERROR_NONE; media_controller_client_s *mc_client = (media_controller_client_s *)client; - int idx = 0; - char *server_name = NULL; - GList *filter_list = NULL; - int filter_cnt = 0; + GList *iter = NULL; mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL"); mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "callback is NULL"); mc_retvm_if(!_mc_util_is_valid_subscription_type(subscription_type) , MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid subscription_type"); - filter_list = mc_client->updated_cb[subscription_type].filter_list; - mc_retvm_if(filter_list == NULL, MEDIA_CONTROLLER_ERROR_NONE, "No filter list for the subscription_type [%d]", subscription_type); + mc_retvm_if(!mc_client->updated_cb[subscription_type].filter_list, MEDIA_CONTROLLER_ERROR_NONE, + "No filter list for the subscription_type [%d]", subscription_type); - filter_cnt = g_list_length(filter_list); - - for (idx = 0; idx < filter_cnt; idx++) { - server_name = g_strdup((char*)g_list_nth_data(filter_list, idx)); - if (MC_STRING_VALID(server_name)) { - if (callback(server_name, user_data) == false) { - MC_SAFE_FREE(server_name); - break; - } - } - MC_SAFE_FREE(server_name); + for (iter = mc_client->updated_cb[subscription_type].filter_list; iter; iter = iter->next) { + if (!MC_STRING_VALID(iter->data)) + continue; + if (!callback(iter->data, user_data)) + break; } return ret; diff --git a/src/media_controller_ipc.c b/src/media_controller_ipc.c index c45ad0e..067e9a8 100644 --- a/src/media_controller_ipc.c +++ b/src/media_controller_ipc.c @@ -67,8 +67,9 @@ static void __mc_ipc_signal_cb(GDBusConnection *connection, gpointer user_data) { GList **listener_list = (GList **)user_data; + GList *found_item = NULL; mc_ipc_listener_s *listener = NULL; - unsigned int i = 0; + char *key = NULL; mc_debug("__mc_ipc_signal_cb Received :"); @@ -76,24 +77,26 @@ static void __mc_ipc_signal_cb(GDBusConnection *connection, gchar *request_id = NULL; g_variant_get(parameters, "(&s&s)", &request_id, &message); - mc_retm_if(message == NULL, "message is NULL"); + mc_retm_if(!message, "message is NULL"); + mc_retm_if(!user_data, "user_data is NULL"); if ((request_id != NULL) && (!g_strcmp0(request_id, DEFAULT_REQ_ID))) request_id = NULL; - char *key = __make_key_for_map(interface_name, signal_name); - mc_retm_if(key == NULL, "key is NULL"); + key = __make_key_for_map(interface_name, signal_name); + mc_retm_if(!key, "key is NULL"); - unsigned int listener_cnt = g_list_length(*listener_list); - for (i = 0; i < listener_cnt; i++) { - listener = (mc_ipc_listener_s *)g_list_nth_data(*listener_list, i); - if (listener && !g_strcmp0(listener->key, key)) { - mc_secure_debug("Received : [%s] (req_id = %s) from %s.%s", message, request_id, listener->interface_name, listener->signal_name); - listener->callback(listener->interface_name, listener->signal_name, message, request_id, listener->user_data); - break; - } + found_item = g_list_find_custom(*listener_list, key, __find_listener_by_key); + if (!found_item) { + mc_secure_error("listener[%s] not found", key); + MC_SAFE_FREE(key); + return; } + listener = found_item->data; + mc_secure_debug("Received : [%s] (req_id = %s) from %s.%s", message, request_id, listener->interface_name, listener->signal_name); + listener->callback(listener->interface_name, listener->signal_name, message, request_id, listener->user_data); + MC_SAFE_FREE(key); } @@ -112,14 +115,12 @@ static void __mc_destroy_listener(gpointer data) static gboolean _mc_ipc_is_listener_duplicated(GList *listener_list, const char *key) { - unsigned int i = 0; + GList *found_item = NULL; mc_retvm_if(!MC_STRING_VALID(key), TRUE, "Invalid Key"); - for (i = 0; i < g_list_length(listener_list); i++) { - mc_ipc_listener_s *listener = (mc_ipc_listener_s *)g_list_nth_data((listener_list), i); - mc_retvm_if(listener && !g_strcmp0(listener->key, key), TRUE, "listener[%s] is duplicated ", key); - } + found_item = g_list_find_custom(listener_list, key, __find_listener_by_key); + mc_retvm_if(found_item, TRUE, "listener[%s] is duplicated ", key); return FALSE; } @@ -246,7 +247,7 @@ 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) { - GList *element = NULL; + GList *found_item = NULL; char *key = NULL; mc_retvm_if(!listener_list, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "listener_list is NULL"); @@ -256,15 +257,15 @@ int mc_ipc_unregister_listener(GList **listener_list, const char *interface_name key = __make_key_for_map(interface_name, signal_name); mc_retvm_if(!key, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "fail to get key"); - 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)); + found_item = g_list_find_custom(*listener_list, (gconstpointer)key, __find_listener_by_key); + if (found_item) { + (*listener_list) = g_list_remove_link(*listener_list, found_item); + __mc_destroy_listener(found_item->data); + g_list_free(found_item); } + mc_debug("listener[%s.%s] is unregistered. listener_cnt[%d]", interface_name, signal_name, g_list_length(*listener_list)); + MC_SAFE_G_FREE(key); return MEDIA_CONTROLLER_ERROR_NONE; diff --git a/src/media_controller_metadata.c b/src/media_controller_metadata.c index 6bd93a1..826010f 100644 --- a/src/media_controller_metadata.c +++ b/src/media_controller_metadata.c @@ -333,15 +333,13 @@ int mc_search_set_condition(mc_search_h search, mc_content_type_e content_type, { int ret = MEDIA_CONTROLLER_ERROR_NONE; media_controller_search_s *mc_search = (media_controller_search_s *)search; - int length = 0; mc_retvm_if(mc_search == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "search is NULL"); mc_retvm_if(((content_type < MC_CONTENT_TYPE_IMAGE) || (content_type > MC_CONTENT_TYPE_UNDECIDED)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "content_type is invalid [%d]", content_type); mc_retvm_if(((category < MC_SEARCH_NO_CATEGORY) || (category > MC_SEARCH_TPO)), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "category is invalid [%d]", category); mc_retvm_if(!MC_STRING_VALID(search_keyword) && (category != MC_SEARCH_NO_CATEGORY), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid search_keyword"); - length = g_list_length(mc_search->search_list); - mc_retvm_if(length > 20, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "So many search items"); + mc_retvm_if(g_list_length(mc_search->search_list) > 20, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Too many search items"); mc_search_item_s *search_item = (mc_search_item_s*)calloc(1, sizeof(mc_search_item_s)); mc_retvm_if(search_item == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "OUT_OF_MEMORY"); @@ -388,23 +386,19 @@ int mc_search_foreach_condition(mc_search_h search, mc_search_condition_cb callb { media_controller_search_s *mc_search = (media_controller_search_s *)search; mc_search_item_s *search_item = NULL; - int length = 0; - int idx = 0; + GList *iter = NULL; mc_retvm_if(mc_search == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid search"); mc_retvm_if(callback == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Invalid callback"); - length = g_list_length(mc_search->search_list); + mc_debug("mc_search_foreach_condition length [%d]", g_list_length(mc_search->search_list)); - mc_debug("mc_search_foreach_condition length [%d]", length); - - for (idx = 0; idx < length; idx++) { - search_item = (mc_search_item_s*)g_list_nth_data(mc_search->search_list, idx); - if (search_item != NULL) { - if (callback(search_item->content_type, search_item->category, search_item->search_keyword, search_item->data, user_data) == false) { - break; - } - } + for (iter = mc_search->search_list; iter; iter = iter->next) { + search_item = (mc_search_item_s*)iter->data; + if (!search_item) + continue; + if (!callback(search_item->content_type, search_item->category, search_item->search_keyword, search_item->data, user_data)) + break; } return MEDIA_CONTROLLER_ERROR_NONE; @@ -416,8 +410,7 @@ int mc_search_clone(mc_search_h src, mc_search_h *dst) media_controller_search_s *_src = (media_controller_search_s *)src; mc_search_h _dst = NULL; mc_search_item_s *search_item = NULL; - int length = 0; - int idx = 0; + GList *iter = NULL; mc_retvm_if(_src == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid src"); mc_retvm_if(dst == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid dst"); @@ -425,12 +418,10 @@ int mc_search_clone(mc_search_h src, mc_search_h *dst) ret = mc_search_create(&_dst); mc_retvm_if(ret != MEDIA_CONTROLLER_ERROR_NONE, ret, "fail to mc_search_create()"); - length = g_list_length(_src->search_list); - - for (idx = 0; idx < length; idx++) { - search_item = (mc_search_item_s*)g_list_nth_data(_src->search_list, idx); - if (search_item == NULL) { - mc_error("Invalid item [%d]", idx); + for (iter = _src->search_list; iter; iter = iter->next) { + search_item = (mc_search_item_s*)iter->data; + if (!search_item) { + mc_error("Invalid item [%p]", iter->data); ret = MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER; mc_search_destroy(_dst); break; diff --git a/src/media_controller_playlist.c b/src/media_controller_playlist.c old mode 100755 new mode 100644 index 0948d64..5e4201d --- a/src/media_controller_playlist.c +++ b/src/media_controller_playlist.c @@ -42,14 +42,22 @@ static void __item_destroy(gpointer data) __release_playlist_item(item); } +static gint __compare_playlist_index(gconstpointer data, gconstpointer user_data) +{ + mc_playlist_item_s *item = (mc_playlist_item_s *)data; + + mc_retvm_if(!item, -1, "empty element"); + + return (gint)g_strcmp0(item->index, (const char *)user_data); +} + static int __get_bundle_data(GList *playlist, bundle_raw **bundle_data, int *bundle_size) { int ret = MEDIA_CONTROLLER_ERROR_NONE; bundle *bundle = NULL; mc_playlist_item_s *item = NULL; char *meta = NULL; - int idx = 0; - int length = 0; + GList *iter = NULL; bundle_raw *raw_data = NULL; int size_r = 0; @@ -57,40 +65,38 @@ static int __get_bundle_data(GList *playlist, bundle_raw **bundle_data, int *bun mc_retvm_if(!bundle_data, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid bundle_data"); mc_retvm_if(!bundle_size, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid bundle_size"); - length = g_list_length(playlist); - mc_retvm_if(!length, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist length"); - bundle = bundle_create(); mc_retvm_if(!bundle, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "fail to bundle_create"); - for (idx = 0; idx < length; idx++) { - item = (mc_playlist_item_s*)g_list_nth_data(playlist, idx); - - if (item && item->index && item->metadata) { - meta = g_strdup_printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", - item->metadata->title, MC_STRING_DELIMITER, - item->metadata->artist, MC_STRING_DELIMITER, - item->metadata->album, MC_STRING_DELIMITER, - item->metadata->author, MC_STRING_DELIMITER, - item->metadata->genre, MC_STRING_DELIMITER, - item->metadata->duration, MC_STRING_DELIMITER, - item->metadata->date, MC_STRING_DELIMITER, - item->metadata->copyright, MC_STRING_DELIMITER, - item->metadata->description, MC_STRING_DELIMITER, - item->metadata->track_num, MC_STRING_DELIMITER, - item->metadata->picture, MC_STRING_DELIMITER, - item->metadata->season, MC_STRING_DELIMITER, - item->metadata->episode, MC_STRING_DELIMITER, - item->metadata->resolution); - - if (meta) { - ret = bundle_add_str(bundle, item->index, meta); - MC_SAFE_G_FREE(meta); - if (ret != BUNDLE_ERROR_NONE) - mc_error("fail to bundle_add_str[%d]", idx); - } - } else { + for (iter = playlist; iter; iter = iter->next) { + item = (mc_playlist_item_s*)iter->data; + + if (!item || !item->index || !item->metadata) { mc_error("wrong playlist item"); + continue; + } + + meta = g_strdup_printf("%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s", + item->metadata->title, MC_STRING_DELIMITER, + item->metadata->artist, MC_STRING_DELIMITER, + item->metadata->album, MC_STRING_DELIMITER, + item->metadata->author, MC_STRING_DELIMITER, + item->metadata->genre, MC_STRING_DELIMITER, + item->metadata->duration, MC_STRING_DELIMITER, + item->metadata->date, MC_STRING_DELIMITER, + item->metadata->copyright, MC_STRING_DELIMITER, + item->metadata->description, MC_STRING_DELIMITER, + item->metadata->track_num, MC_STRING_DELIMITER, + item->metadata->picture, MC_STRING_DELIMITER, + item->metadata->season, MC_STRING_DELIMITER, + item->metadata->episode, MC_STRING_DELIMITER, + item->metadata->resolution); + + if (meta) { + ret = bundle_add_str(bundle, item->index, meta); + MC_SAFE_G_FREE(meta); + if (ret != BUNDLE_ERROR_NONE) + mc_error("fail to bundle_add_str[%p]", iter->data); } } @@ -169,32 +175,15 @@ int mc_playlist_update_item(mc_playlist_h playlist, const char *index, mc_meta_e int ret = MEDIA_CONTROLLER_ERROR_NONE; mc_playlist_s *_playlist = (mc_playlist_s*)playlist; mc_playlist_item_s *_playlist_item = NULL; - int length = 0; - int idx = 0; - gboolean found = FALSE; + GList *found_item = NULL; mc_retvm_if(_playlist == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid playlist"); mc_retvm_if(!MC_STRING_VALID(index), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid index"); - if (_playlist->item_list != NULL) { - length = g_list_length(_playlist->item_list); - - mc_retvm_if((length > MAX_PLAYLIST_LEN), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Exceeding max playlist item [%d]", MAX_PLAYLIST_LEN); - - for (idx = 0; idx < length; idx++) { - mc_playlist_item_s *_item = NULL; - _item = (mc_playlist_item_s*)g_list_nth_data(_playlist->item_list, idx); - if (_item != NULL) { - if (g_strcmp0(_item->index, index) == 0) { - _playlist_item = _item; - found = TRUE; - break; - } - } - } - } + mc_retvm_if((g_list_length(_playlist->item_list) > MAX_PLAYLIST_LEN), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Exceeding max playlist item [%d]", MAX_PLAYLIST_LEN); - if (!found) { + found_item = g_list_find_custom(_playlist->item_list, __compare_playlist_index, (void *)index); + if (!found_item) { _playlist_item = (mc_playlist_item_s*)calloc(1, sizeof(mc_playlist_item_s)); mc_retvm_if(_playlist_item == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "memory alloc fail"); @@ -207,18 +196,19 @@ int mc_playlist_update_item(mc_playlist_h playlist, const char *index, mc_meta_e _playlist_item->index = g_strdup(index); } else { + _playlist_item = (mc_playlist_item_s *)found_item->data; mc_retvm_if(_playlist_item->metadata == NULL, MEDIA_CONTROLLER_ERROR_INVALID_OPERATION, "invalid playlist item"); } ret = _mc_metadata_set((mc_playlist_h)_playlist_item->metadata, attribute, value); if (ret != MEDIA_CONTROLLER_ERROR_NONE) { - if (!found) + if (!found_item) __release_playlist_item(_playlist_item); return ret; } - if (!found) + if (!found_item) _playlist->item_list = g_list_append(_playlist->item_list, _playlist_item); return ret; diff --git a/svc/media_controller_svc.c b/svc/media_controller_svc.c index 021997e..30aa455 100644 --- a/svc/media_controller_svc.c +++ b/svc/media_controller_svc.c @@ -126,38 +126,34 @@ static void __mc_add_cmd_to_send(gpointer data, gpointer user_data) mc_app_data_set_t *_app_data = (mc_app_data_set_t *)data; mc_comm_msg_s *_user_data = (mc_comm_msg_s *)user_data; + mc_retm_if(!_app_data, "Invalid data"); + mc_retm_if(!_user_data, "Invalid user_data"); + if (_app_data->pid == _user_data->pid) _app_data->cmds_to_send = g_list_append(_app_data->cmds_to_send, g_strdup(_user_data->msg)); } static void __mc_remove_cmd_to_send(gpointer data, gpointer user_data) { - mc_app_data_set_t *_app_data = (mc_app_data_set_t *)data; mc_list_user_data *_user_data = (mc_list_user_data *)user_data; - mc_comm_msg_s *_message = NULL; - unsigned int i = 0; - unsigned int length_of_list = 0; - char *value = NULL; - - mc_retm_if(!data, "Invalid data"); - mc_retm_if(!user_data, "Invalid user_data"); + GList *iter = NULL; - _message = (mc_comm_msg_s *)_user_data->message; - mc_retm_if(_message->msg_size == 0, "Invalid msg_size"); - mc_retm_if(!MC_STRING_VALID(_message->msg), "Invalid msg"); + mc_retm_if(!_app_data, "Invalid data"); + mc_retm_if(!_user_data, "Invalid user_data"); + mc_retm_if(!_user_data->message, "Invalid message"); + mc_retm_if(!_user_data->message->msg_size, "Invalid msg_size"); + mc_retm_if(!MC_STRING_VALID(_user_data->message->msg), "Invalid msg"); mc_retm_if(!_app_data->cmds_to_send, "Nothing to remove"); - length_of_list = g_list_length(_app_data->cmds_to_send); - - for (i = 0; i < length_of_list; i++) { - value = (char *)g_list_nth_data(_app_data->cmds_to_send, i); + for (iter = _app_data->cmds_to_send; iter; iter = iter->next) { + if (!iter->data) + continue; - if (g_strcmp0(value, _message->msg) == 0) { - _app_data->cmds_to_send = g_list_remove(_app_data->cmds_to_send, value); - MC_SAFE_FREE(value); + if (!g_strcmp0(iter->data, _user_data->message->msg)) { + _app_data->cmds_to_send = g_list_remove_link(_app_data->cmds_to_send, iter); + g_list_free_full(iter, g_free); _user_data->result++; - break; } } } @@ -522,39 +518,34 @@ static int __mc_notify_server_updated(const char *server_name, mc_server_state_e static int _mc_service_app_dead_handler(int pid, void *data) { mc_service_t *_service_data = (mc_service_t *)data; - unsigned int length_of_list = 0; - int i = 0; + GList *iter = NULL; + mc_app_data_set_t *_app_data = NULL; mc_secure_debug("Received app_dead signal (pid : %d)", pid); - mc_retvm_if((_service_data == NULL), AUL_R_ERROR, "data is null!"); - mc_retvm_if((_service_data->connected_apps == NULL), AUL_R_OK, "No connected application!"); + mc_retvm_if(!_service_data, AUL_R_ERROR, "data is null!"); + mc_retvm_if(!_service_data->connected_apps, AUL_R_OK, "No connected application!"); - length_of_list = g_list_length(_service_data->connected_apps); - for (i = (int)(length_of_list - 1); i >= 0; i--) { - mc_app_data_set_t *_app_data = NULL; + for (iter = _service_data->connected_apps; iter; iter = iter->next) { + _app_data = (mc_app_data_set_t *)iter->data; - _app_data = g_list_nth_data(_service_data->connected_apps, i); - if (!_app_data) + if ((!_app_data) || (_app_data->pid != pid)) continue; - if (_app_data->pid == pid) { - mc_secure_debug("app_dead(appid) : %s", _app_data->app_id); - - /* Delete and update information of dead application on database */ - if (MEDIA_CONTROLLER_ERROR_NONE != mc_db_remove_application(_app_data->uid, _app_data->app_id, _app_data->priv_type)) - mc_secure_error("Fail to remove dead application"); + mc_secure_debug("app_dead(appid) : %s", _app_data->app_id); - /* Sends notification for deactivated server via dbus */ - if (_app_data->priv_type == MC_PRIV_TYPE_SERVER) { - if (MEDIA_CONTROLLER_ERROR_NONE != __mc_notify_server_updated(_app_data->app_id, MC_SERVER_STATE_DEACTIVATE)) - mc_secure_error("Fail to notify deactivated server"); - } + /* Delete and update information of dead application on database */ + if (MEDIA_CONTROLLER_ERROR_NONE != mc_db_remove_application(_app_data->uid, _app_data->app_id, _app_data->priv_type)) + mc_secure_error("Fail to remove dead application"); - if (MEDIA_CONTROLLER_ERROR_NONE == __mc_list_remove_item(&_service_data->connected_apps, i)) { - g_connection_cnt--; - mc_secure_error("[No-error] decreased connection count [%d]", g_connection_cnt); - } + /* Sends notification for deactivated server via dbus */ + if (_app_data->priv_type == MC_PRIV_TYPE_SERVER) { + if (MEDIA_CONTROLLER_ERROR_NONE != __mc_notify_server_updated(_app_data->app_id, MC_SERVER_STATE_DEACTIVATE)) + mc_secure_error("Fail to notify deactivated server"); } + + _app_data->cmds_to_send = g_list_remove_link(_app_data->cmds_to_send, iter); + g_list_free_full(iter, __mc_destroy_connected_apps); + mc_secure_error("[No-error] decreased connection count [%d]", --g_connection_cnt); } return AUL_R_OK; diff --git a/test/server_test/media_controller_server_test.c b/test/server_test/media_controller_server_test.c index b7b3f1b..c77d6fd 100755 --- a/test/server_test/media_controller_server_test.c +++ b/test/server_test/media_controller_server_test.c @@ -345,6 +345,7 @@ static int __update_playlist(mc_server_h server, mc_playlist_update_mode_e mode) const char *playlist_name_2 = "test_2"; unsigned int idx = 0; GList *playlist_list = NULL; + GList *iter = NULL; char *season = NULL; char *episode = NULL; char *resolution = NULL; @@ -454,11 +455,11 @@ static int __update_playlist(mc_server_h server, mc_playlist_update_mode_e mode) if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Fail to mc_playlist_foreach_playlist [%d]", ret); - for (idx = 0; idx < g_list_length(playlist_list); idx++) { + for (iter = playlist_list; iter; iter = iter->next) { mc_playlist_h playlist = NULL; char *playlist_name = NULL; - playlist = (mc_playlist_h)g_list_nth_data(playlist_list, idx); + playlist = (mc_playlist_h)iter->data; ret = mc_playlist_get_name(playlist, &playlist_name); if (ret != MEDIA_CONTROLLER_ERROR_NONE) mc_error("Fail to mc_playlist_get_name [%d]", ret);