Add signal handler for app_dead_signal 64/198064/16 accepted/tizen/unified/20190208.061729 submit/tizen/20190207.042229
authorjiyong.min <jiyong.min@samsung.com>
Fri, 18 Jan 2019 07:30:36 +0000 (16:30 +0900)
committerjiyong.min <jiyong.min@samsung.com>
Tue, 29 Jan 2019 06:37:18 +0000 (15:37 +0900)
 - When app_dead_signal is raised, remove pid from connected_list
   and decrease connection count

Change-Id: I6deaf323619ef12e1ba9616debdb6ae65fce37a8

packaging/capi-media-controller.spec
svc/CMakeLists.txt
svc/media_controller_cynara.c
svc/media_controller_svc.c [changed mode: 0755->0644]

index b272138..f92d49c 100755 (executable)
@@ -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
index d6d2728..5a239c6 100755 (executable)
@@ -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})
index 6c8848e..db50a4e 100755 (executable)
@@ -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); */
old mode 100755 (executable)
new mode 100644 (file)
index 8932519..2810ff5
@@ -19,6 +19,7 @@
 #include <systemd/sd-login.h>
 #include <gio/gio.h>
 #include <sys/stat.h>
+#include <aul.h>
 
 #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 */