From dcd0691790ab3535ed1f409744e2369f2c2248f5 Mon Sep 17 00:00:00 2001 From: Ji Yong Min Date: Fri, 17 Jul 2015 13:15:44 +0900 Subject: [PATCH] [media-controller] Fix known issue - Modify the way to check service connection - Fix memory leak for creation Change-Id: Ief599568e981164be4bc2fe19b5a44f61b485a6c Signed-off-by: Jiyong Min --- src/media_controller_client.c | 98 ++++++++++++++++++++++++++----------------- src/media_controller_ipc.c | 69 ++++-------------------------- src/media_controller_server.c | 57 +++++++++---------------- 3 files changed, 86 insertions(+), 138 deletions(-) diff --git a/src/media_controller_client.c b/src/media_controller_client.c index 414dc06..53acc8f 100755 --- a/src/media_controller_client.c +++ b/src/media_controller_client.c @@ -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) { diff --git a/src/media_controller_ipc.c b/src/media_controller_ipc.c index 8267aea..eed136f 100755 --- a/src/media_controller_ipc.c +++ b/src/media_controller_ipc.c @@ -21,76 +21,20 @@ #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"); diff --git a/src/media_controller_server.c b/src/media_controller_server.c index 9008ec5..bb1346a 100755 --- a/src/media_controller_server.c +++ b/src/media_controller_server.c @@ -17,21 +17,19 @@ #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); -- 2.7.4