From: jiyong.min Date: Fri, 18 Jan 2019 07:30:36 +0000 (+0900) Subject: Add signal handler for app_dead_signal X-Git-Tag: accepted/tizen/unified/20190208.061729^0 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=28658aaec1346e209fdd27b73b2ebc3261d39c8a;p=platform%2Fcore%2Fapi%2Fmedia-controller.git Add signal handler for app_dead_signal - When app_dead_signal is raised, remove pid from connected_list and decrease connection count Change-Id: I6deaf323619ef12e1ba9616debdb6ae65fce37a8 --- diff --git a/packaging/capi-media-controller.spec b/packaging/capi-media-controller.spec index b272138..f92d49c 100755 --- a/packaging/capi-media-controller.spec +++ b/packaging/capi-media-controller.spec @@ -1,6 +1,6 @@ Name: capi-media-controller Summary: A media controller library in Tizen Native API -Version: 0.1.80 +Version: 0.1.81 Release: 1 Group: Multimedia/API License: Apache-2.0 diff --git a/svc/CMakeLists.txt b/svc/CMakeLists.txt index d6d2728..5a239c6 100755 --- a/svc/CMakeLists.txt +++ b/svc/CMakeLists.txt @@ -1,5 +1,5 @@ # for package file -SET(dependents "capi-base-common glib-2.0 gio-2.0 dlog sqlite3 libsystemd-daemon libsystemd-login libtzplatform-config cynara-client cynara-session cynara-creds-socket") +SET(dependents "capi-base-common glib-2.0 gio-2.0 dlog aul sqlite3 libsystemd-daemon libsystemd-login libtzplatform-config cynara-client cynara-session cynara-creds-socket") SET(fw_svc "media-controller-svc") PROJECT(${fw_svc}) diff --git a/svc/media_controller_cynara.c b/svc/media_controller_cynara.c index 6c8848e..db50a4e 100755 --- a/svc/media_controller_cynara.c +++ b/svc/media_controller_cynara.c @@ -139,6 +139,7 @@ int mc_cynara_receive_untrusted_message(int sockfd, mc_comm_msg_s *recv_msg, mc_ } else { mc_error("wrong msg_size [%zu]", recv_msg->msg_size); recv_msg->msg = NULL; + return MEDIA_CONTROLLER_ERROR_INVALID_OPERATION; } /* mc_debug("receive msg[%d] from [%d(%d)] %d, %s", recv_msg_size, recv_msg->pid, recv_msg->uid, recv_msg->msg_type, recv_msg->msg); */ diff --git a/svc/media_controller_svc.c b/svc/media_controller_svc.c old mode 100755 new mode 100644 index 8932519..2810ff5 --- a/svc/media_controller_svc.c +++ b/svc/media_controller_svc.c @@ -19,6 +19,7 @@ #include #include #include +#include #include "media_controller_svc.h" #include "media_controller_private.h" @@ -169,6 +170,49 @@ static void __mc_get_data(gpointer data, gpointer user_data) } } +static int __mc_list_get_index(GList *list, int pid, mc_priv_type_e priv_type) +{ + unsigned int length_of_list = 0; + unsigned int i; + mc_list_data_set_t *ptr = NULL; + + mc_retvm_if(list == NULL, -1, "list is null"); + + length_of_list = (unsigned int)g_list_length(list); + for (i = 0; i < length_of_list; i++) { + ptr = g_list_nth_data(list, i); + if (ptr == NULL) + continue; + if (ptr->pid == pid) { + if (ptr->priv_type == priv_type) + return i; + } + } + return -1; +} + +static int __mc_list_remove_item(GList **list, int index) +{ + mc_retvm_if(list == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid list"); + mc_retvm_if(index < 0 || index >= (int)g_list_length(*list), MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "invalid index"); + + mc_secure_error("[No-error] index : %d", index); + + mc_list_data_set_t *app_data = g_list_nth_data(*list, index); + if (app_data != NULL) { + *list = g_list_remove(*list, app_data); + MC_SAFE_FREE(app_data->app_id); + if (app_data->s_data != NULL) { + mc_secure_error("[No-error] sub_data length [%u]", g_list_length(app_data->s_data)); + g_list_free_full(app_data->s_data, __mc_destroy_data_list); + } + MC_SAFE_FREE(app_data); + mc_secure_error("[No-error] data has been removed"); + } + + return MEDIA_CONTROLLER_ERROR_NONE; +} + static int _mc_service_init(mc_service_t **data) { int res = MEDIA_CONTROLLER_ERROR_NONE; @@ -299,31 +343,9 @@ static gboolean _mc_service_is_valid_queue(mc_service_t *data) return TRUE; } -static int _mc_service_get_list_index(GList *list, int pid, mc_priv_type_e priv_type) -{ - unsigned int length_of_list = 0; - unsigned int i; - mc_list_data_set_t *ptr = NULL; - - if (list == NULL) - return -1; - - length_of_list = (unsigned int)g_list_length(list); - for (i = 0; i < length_of_list; i++) { - ptr = g_list_nth_data(list, i); - if (ptr == NULL) - return -1; - if (ptr->pid == pid) { - if (ptr->priv_type == priv_type) - return i; - } - } - return -1; -} - static gboolean _mc_service_is_exist_pid(GList *list, int pid, mc_priv_type_e priv_type) { - int res = _mc_service_get_list_index(list, pid, priv_type); + int res = __mc_list_get_index(list, pid, priv_type); return (res == -1) ? FALSE : TRUE; } @@ -381,28 +403,11 @@ static int _mc_service_remove_connection(GList **connected_list, mc_comm_msg_s * { mc_debug_fenter(); - int idx = _mc_service_get_list_index(*connected_list, request_msg->pid, request_msg->priv_type); - if (idx == -1) { - mc_error("node is null, it is already disconnected!"); - return MEDIA_CONTROLLER_ERROR_NONE; - } - mc_error("[No-error] idx [%d]", idx); - - mc_list_data_set_t *data = g_list_nth_data(*connected_list, idx); - if (data != NULL) { - mc_error("[No-error] data [%p]", data); - - *connected_list = g_list_remove(*connected_list, data); + int idx = __mc_list_get_index(*connected_list, request_msg->pid, request_msg->priv_type); + mc_retvm_if(idx == -1, MEDIA_CONTROLLER_ERROR_NONE, "node is null, it has been already disconnected!"); - MC_SAFE_FREE(data->app_id); - - if (data->s_data != NULL) { - mc_error("[No-error] s_data [%p], length [%d]", data->s_data, g_list_length(data->s_data)); - g_list_free_full(data->s_data, __mc_destroy_data_list); - } - mc_error("[No-error] data set will be free"); - MC_SAFE_FREE(data); - } + if (MEDIA_CONTROLLER_ERROR_NONE != __mc_list_remove_item(connected_list, idx)) + mc_error("Fail to remove connection from list"); g_connection_cnt--; mc_error("[No-error] decreased connection count [%d]", g_connection_cnt); @@ -440,6 +445,41 @@ static int _mc_service_get_data(GList **connected_list, mc_comm_msg_s *request_m } } +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; + + 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 == NULL), AUL_R_OK, "No connected application!"); + + length_of_list = g_list_length(_service_data->connected); + for (i = (int)(length_of_list - 1); i >= 0; i--) { + mc_list_data_set_t *app_data = NULL; + + app_data = g_list_nth_data(_service_data->connected, i); + if (app_data == NULL) + continue; + + if (app_data->pid == pid) { + mc_secure_debug("app_dead(appid) : %s", app_data->app_id); + + /* TODO: Delete application from database and + * send notifiaction to deactivation message via dbus + */ + + if (MEDIA_CONTROLLER_ERROR_NONE == __mc_list_remove_item(&_service_data->connected, i)) { + g_connection_cnt--; + mc_secure_error("[No-error] decreased connection count [%d]", g_connection_cnt); + } + } + } + + return AUL_R_OK; +} + gboolean _mc_service_process(gpointer data) { int res = MEDIA_CONTROLLER_ERROR_NONE; @@ -507,7 +547,7 @@ gboolean _mc_service_process(gpointer data) } else if (request_msg->msg_type == MC_MSG_CLIENT_GET) { send_msg = _mc_service_get_data(&(_service_data->connected), request_msg); } else if (request_msg->msg_type == MC_MSG_SERVER_CONNECTION) { - if(MC_STRING_VALID(request_msg->msg)) { + if (MC_STRING_VALID(request_msg->msg)) { send_msg = _mc_service_add_connection(&(_service_data->connected), request_msg); } else { mc_error("Wrong message!"); @@ -726,6 +766,14 @@ gboolean mc_svc_thread(void *data) return FALSE; } + /* Register app_dead signal handler */ + if (aul_listen_app_dead_signal(_mc_service_app_dead_handler, mc_service_data) != AUL_R_OK) { + mc_error("Failed to register app_dead signal"); + _mc_service_deinit(mc_service_data); + close(sockfd); + return FALSE; + } + context = g_main_context_new(); if (context == NULL) mc_error("g_main_context_new failed"); @@ -753,6 +801,10 @@ gboolean mc_svc_thread(void *data) mc_debug("*** Media Controller Service thread will be closed ***"); + /* Unregister app_dead signal handler */ + if (aul_listen_app_dead_signal(NULL, NULL) != AUL_R_OK) + mc_error("Failed to unregister app_dead signal"); + _mc_service_deinit(mc_service_data); /* Free resources */