[media-controller] Fix known issue 23/44123/1 accepted/tizen/mobile/20150723.050609 accepted/tizen/tv/20150723.050732 accepted/tizen/wearable/20150723.050749 submit/tizen/20150723.004006
authorJi Yong Min <jiyong.min@samsung.com>
Fri, 17 Jul 2015 04:15:44 +0000 (13:15 +0900)
committerJi Yong Min <jiyong.min@samsung.com>
Fri, 17 Jul 2015 04:26:45 +0000 (13:26 +0900)
- Modify the way to check service connection
- Fix memory leak for creation

Change-Id: Ief599568e981164be4bc2fe19b5a44f61b485a6c
Signed-off-by: Jiyong Min <jiyong.min@samsung.com>
src/media_controller_client.c
src/media_controller_ipc.c
src/media_controller_server.c

index 414dc06..53acc8f 100755 (executable)
@@ -152,6 +152,60 @@ static void __client_reply_cb(const char *interface_name, const char *signal_nam
        g_strfreev(params);
 }
 
+static int __mc_client_create(media_controller_client_s **mc_client)
+{
+       int ret = MEDIA_CONTROLLER_ERROR_NONE;
+       media_controller_client_s *_client = NULL;
+
+       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
+
+       _client = (media_controller_client_s *)calloc(1, sizeof(media_controller_client_s));
+       mc_retvm_if(_client == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "Error allocation memory");
+
+       ret = mc_util_get_own_name(&(_client->client_name));
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Filed to get client name %d", ret);
+               goto Error;
+       }
+
+       ret = mc_ipc_get_dbus_connection(&(_client->dconn), &(_client->dref_count));
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("error in client init %d", ret);
+               goto Error;
+       }
+
+       ret = mc_db_connect(&_client->db_handle);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("error in connecting to DB %d", ret);
+               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;
+Error:
+       if (_client->dconn)
+               mc_ipc_unref_dbus_connection(_client->dconn, &_client->dref_count);
+
+       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);
+
+       return ret;
+}
+
 static int __mc_client_destroy(media_controller_client_s *mc_client)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
@@ -170,6 +224,10 @@ static int __mc_client_destroy(media_controller_client_s *mc_client)
                        mc_error("fail to mc_db_disconnect");
        }
 
+       if (mc_client->listeners != NULL) {
+               g_list_free(mc_client->listeners);
+       }
+
        MC_SAFE_FREE(mc_client->client_name);
        MC_SAFE_FREE(mc_client);
 
@@ -184,48 +242,16 @@ int mc_client_create(mc_client_h *client)
 
        mc_retvm_if(client == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
 
-       mc_client = (media_controller_client_s *)calloc(1, sizeof(media_controller_client_s));
-       mc_retvm_if(mc_client == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "Error allocation memory");
-
-       mc_client->listeners = g_list_alloc();
-       if (mc_client->listeners == NULL) {
-               ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
-               mc_error("Error allocation list %d", ret);
-               __mc_client_destroy(mc_client);
-               return ret;
-       }
-
        /*Try Socket Activation by systemd*/
        ret = mc_ipc_service_connect();
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                mc_error("Failed to get mc_ipc_service_connect [%d]", ret);
-       }
-
-       /*Send Connection Msg to Server*/
-       ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_CONNECTION, MC_SERVER_CONNECTION_MSG);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("Failed to mc_ipc_send_message_to_server [%d]", ret);
-               return ret;
-       }
-
-       ret = mc_util_get_own_name(&(mc_client->client_name));
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("Filed to get client name %d", ret);
-               __mc_client_destroy(mc_client);
-               return ret;
-       }
-
-       ret = mc_ipc_get_dbus_connection(&(mc_client->dconn), &(mc_client->dref_count));
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("error in client init %d", ret);
-               __mc_client_destroy(mc_client);
                return ret;
        }
 
-       ret = mc_db_connect(&mc_client->db_handle);
+       ret = __mc_client_create(&mc_client);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("error in connecting to DB %d", ret);
-               __mc_client_destroy(mc_client);
+               mc_error("Failed __mc_server_create [%d]", ret);
                return ret;
        }
 
@@ -725,10 +751,6 @@ int mc_client_destroy(mc_client_h client)
                mc_error("Error mc_ipc_unregister_all_listener [%d]", ret);
        }
 
-       if (mc_client->listeners != NULL) {
-               g_list_free(mc_client->listeners);
-       }
-
        /*Send Disconnection Msg to Server*/
        ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_DISCONNECTION, MC_SERVER_DISCONNECTION_MSG);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
index 8267aea..eed136f 100755 (executable)
 #include "media_controller_private.h"
 
 #define MAX_RETRY_COUNT 3
-#define MAX_WAIT_COUNT 3
+#define MAX_WAIT_COUNT 100
 #define MC_SVC_NAME "mediacontroller"
 
-GMainLoop *g_wait_mainloop = NULL;
-
-static gboolean __timeout_func(gpointer data)
-{
-    mc_debug("Timeout!");
-    g_main_loop_quit((GMainLoop *) data);
-    return FALSE;
-}
-
-static void __wait_for_activate()
-{
-    int timeout_id = 0;
-    g_wait_mainloop = g_main_loop_new(NULL, FALSE);
-
-    timeout_id = g_timeout_add(500, __timeout_func, g_wait_mainloop);
-    g_main_loop_run(g_wait_mainloop);
-    g_source_remove(timeout_id);
-       g_main_loop_unref(g_wait_mainloop);
-       g_wait_mainloop = NULL;
-}
-
 /* This checks if service daemon is running */
 static gboolean __is_service_activated()
 {
        gboolean ret = FALSE;
-       DIR *pdir;
-       struct dirent pinfo;
-       struct dirent *result = NULL;
-
-       pdir = opendir("/proc");
-       if (pdir == NULL) {
-               mc_error("err: NO_DIR");
+       ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_CONNECTION, MC_SERVER_CONNECTION_MSG);
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Failed to mc_ipc_send_message_to_server [%d]", ret);
                return FALSE;
        }
 
-       while (!readdir_r(pdir, &pinfo, &result)) {
-               if (result == NULL)
-                       break;
-
-               if (pinfo.d_type != 4 || pinfo.d_name[0] == '.'
-                   || pinfo.d_name[0] > 57)
-                       continue;
-
-               FILE *fp;
-               char buff[128];
-               char path[128];
-
-               snprintf(path, sizeof(path), "/proc/%s/status", pinfo.d_name);
-               fp = fopen(path, "rt");
-               if (fp) {
-                       if (fgets(buff, 128, fp) == NULL)
-                               mc_error("fgets failed");
-                       fclose(fp);
-
-                       if (strstr(buff, MC_SVC_NAME)) {
-                               mc_error("%s proc is already running", buff);
-                               ret = TRUE;
-                               break;
-                       }
-               } else {
-                       mc_error("Can't read file [%s]", path);
-               }
-       }
-
-       closedir(pdir);
-
-       return ret;
+       return TRUE;
 }
 
 static char *__make_key_for_map(const char *main_key, const char *sub_key)
@@ -464,7 +408,8 @@ int mc_ipc_service_connect(void)
        mc_ipc_delete_client_socket(&sock_info);
 
        while((__is_service_activated() == FALSE) && (retrycount++ < MAX_WAIT_COUNT)) {
-               __wait_for_activate();
+               usleep(200000);
+               mc_error("retry count: %d", retrycount);
        }
 
        mc_debug("CONNECT OK");
index 9008ec5..bb1346a 100755 (executable)
 #include "media_controller_private.h"
 #include "media_controller_db.h"
 
-static int __mc_server_create(media_controller_server_s **mc_server, const char *server_name)
+static int __mc_server_create(media_controller_server_s **mc_server)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
        media_controller_server_s *_server = NULL;
 
        mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is NULL");
-       mc_retvm_if(server_name == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "service_name is NULL");
 
        _server = (media_controller_server_s *)calloc(1, sizeof(media_controller_server_s));
        mc_retvm_if(_server == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "Error allocation memory");
 
-       _server->server_name = strdup(server_name);
-       if (_server->server_name == NULL) {
-               mc_error("Error allocation memory");
-               ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
+       ret = mc_util_get_own_name(&(_server->server_name));
+       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
+               mc_error("Failed to get server_name [%d]", ret);
                goto ERROR;
        }
 
@@ -54,6 +52,13 @@ static int __mc_server_create(media_controller_server_s **mc_server, const char
                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;
@@ -65,6 +70,9 @@ 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);
@@ -90,6 +98,10 @@ static int __mc_server_destoy(media_controller_server_s *mc_server)
                        mc_error("fail to mc_db_disconnect");
        }
 
+       if (mc_server->listeners != NULL) {
+               g_list_free(mc_server->listeners);
+       }
+
        MC_SAFE_FREE(mc_server->server_name);
 
        if (mc_server->metadata) {
@@ -539,7 +551,6 @@ int mc_server_send_command_reply(mc_server_h server, const char *client_name, in
 int mc_server_create(mc_server_h *server)
 {
        int ret = MEDIA_CONTROLLER_ERROR_NONE;
-       char *server_name = NULL;
        media_controller_server_s *mc_server = NULL;
        bool table_exist = FALSE;
 
@@ -547,42 +558,16 @@ int mc_server_create(mc_server_h *server)
 
        mc_retvm_if(server == NULL, MEDIA_CONTROLLER_ERROR_INVALID_PARAMETER, "Handle is null");
 
-       mc_server = (media_controller_server_s *)calloc(1, sizeof(media_controller_server_s));
-       mc_retvm_if(mc_server == NULL, MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY, "Error allocation memory");
-
        /*Try Socket Activation by systemd*/
        ret = mc_ipc_service_connect();
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                mc_error("Failed to get mc_ipc_service_connect [%d]", ret);
-       }
-
-       /*Send Connection Msg to Server*/
-       ret = mc_ipc_send_message_to_server(MC_MSG_SERVER_CONNECTION, MC_SERVER_CONNECTION_MSG);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("Failed to mc_ipc_send_message_to_server [%d]", ret);
                return ret;
        }
 
-       ret = mc_util_get_own_name(&server_name);
-       if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
-               mc_error("Failed to get server_name [%d]", ret);
-               return ret;
-       }
-
-       ret = __mc_server_create(&mc_server, server_name);
+       ret = __mc_server_create(&mc_server);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE) {
                mc_error("fail __mc_server_create [%d]", ret);
-               MC_SAFE_FREE(server_name);
-               __mc_server_destoy(mc_server);
-               return ret;
-       }
-
-       MC_SAFE_FREE(server_name);
-
-       mc_server->listeners = g_list_alloc();
-       if (mc_server->listeners == NULL) {
-               ret = MEDIA_CONTROLLER_ERROR_OUT_OF_MEMORY;
-               mc_error("Error allocation list %d", ret);
                __mc_server_destoy(mc_server);
                return ret;
        }
@@ -663,10 +648,6 @@ int mc_server_destroy(mc_server_h server)
                mc_error("fail mc_ipc_unregister_all_listener [%d]", ret);
        }
 
-       if (mc_server->listeners != NULL) {
-               g_list_free(mc_server->listeners);
-       }
-
        ret = mc_db_delete_server_address_from_table(mc_server->db_handle, MC_DB_TABLE_SERVER_LIST, mc_server->server_name);
        if (ret != MEDIA_CONTROLLER_ERROR_NONE)
                mc_error("fail mc_db_delete_server_address_from_table [%d]", ret);