Improve memory deallocation 43/222743/3
authorMinje Ahn <minje.ahn@samsung.com>
Mon, 20 Jan 2020 00:28:41 +0000 (09:28 +0900)
committerMinje Ahn <minje.ahn@samsung.com>
Mon, 20 Jan 2020 05:25:42 +0000 (14:25 +0900)
Improve deallocation functions for g_slist and g_hash_table

Change-Id: I96cab6064897e7a57b0d20352b32095da3c5f09e
Signed-off-by: Minje Ahn <minje.ahn@samsung.com>
packaging/libmedia-service.spec
src/common/media-svc-db-utils.c

index 336d77c..573075c 100644 (file)
@@ -1,6 +1,6 @@
 Name:       libmedia-service
 Summary:    Media information service library for multimedia applications
-Version: 0.4.5
+Version: 0.4.6
 Release:    0
 Group:      Multimedia/Libraries
 License:    Apache-2.0 and PD
index 37e87b9..11cd2f1 100755 (executable)
@@ -124,7 +124,7 @@ static int __create_playlist_view(uid_t uid)
        media_svc_retvm_if(!table_query, MS_MEDIA_ERR_INTERNAL, "g_string_new failed");
 
        len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
                if (col_ptr->is_view) {
                        if (table_query->len != 0) {
@@ -139,7 +139,7 @@ static int __create_playlist_view(uid_t uid)
        }
 
        len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
                if (col_ptr->is_view) {
                        if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
@@ -150,7 +150,7 @@ static int __create_playlist_view(uid_t uid)
        }
 
        len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
                if (col_ptr->is_view)
                        g_string_append_printf(table_query, ", media.%s", col_ptr->name);
@@ -175,7 +175,7 @@ static int __create_tag_view(uid_t uid)
        media_svc_retvm_if(!table_query, MS_MEDIA_ERR_INTERNAL, "g_string_new failed");
 
        len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
                if (col_ptr->is_view) {
                        if (table_query->len != 0)
@@ -186,7 +186,7 @@ static int __create_tag_view(uid_t uid)
        }
 
        len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
                if (col_ptr->is_view) {
                        if (strncmp(col_ptr->name, MEDIA_SVC_DB_COLUMN_MAP_ID, strlen(MEDIA_SVC_DB_COLUMN_MAP_ID)) == 0)
@@ -197,7 +197,7 @@ static int __create_tag_view(uid_t uid)
        }
 
        len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
                if (col_ptr->is_view)
                        g_string_append_printf(table_query, ", media.%s", col_ptr->name);
@@ -272,7 +272,7 @@ int _media_svc_make_table_query(const char *table_name, media_svc_table_slist_e
                goto ERROR;
        }
 
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[list], i);
                /*create table */
                if (col_ptr->has_option) {
@@ -377,7 +377,7 @@ static int __media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table
        SQLITE3_FINALIZE(sql_stmt);
 
        len = g_slist_length(column_list[list]);
-       for (i = 1; i < len; i++) {
+       for (i = 0; i < len; i++) {
                col_ptr = g_slist_nth_data(column_list[list], i);
                if (col_ptr->version > cur_version) {
                        /*alter table */
@@ -403,15 +403,37 @@ static int __media_svc_upgrade_table_query(sqlite3 *db_handle, const char *table
        return MS_MEDIA_ERR_NONE;
 }
 
+static void __media_svc_table_free(gpointer data)
+{
+       table_info_s *tb = (table_info_s *) data;
+       SAFE_FREE(tb->trigger_name);
+       SAFE_FREE(tb->view_name);
+       SAFE_FREE(tb->event_table);
+       SAFE_FREE(tb->action_table);
+       SAFE_FREE(tb);
+}
+
+static void __media_svc_column_free(gpointer data)
+{
+       column_info_s *col = (column_info_s *) data;
+
+       /* Item in slist can be null */
+       if (!col)
+               return;
+
+       SAFE_FREE(col->name);
+       SAFE_FREE(col->type);
+       SAFE_FREE(col->option);
+       SAFE_FREE(col->index_name);
+       SAFE_FREE(col);
+}
+
 int _media_svc_init_table_query(const char *event_table_name)
 {
        int ret = MS_MEDIA_ERR_NONE;
-       int i = 0;
 
        /*variable initialize.. */
-       table = g_hash_table_new(g_str_hash, g_str_equal);
-       for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
-               column_list[i] = g_slist_alloc();
+       table = g_hash_table_new_full(g_str_hash, g_str_equal, NULL, __media_svc_table_free);
 
        /*table specification.. (table_name, index, unique set, trigger, view, trigger name, event table, action table, view name) */
        ret = __media_svc_add_table_info(MEDIA_SVC_DB_TABLE_MEDIA, NULL, NULL, NULL, NULL);
@@ -667,137 +689,17 @@ int _media_svc_init_table_query(const char *event_table_name)
 
        return ret;
 }
-void __media_svc_table_free(table_info_s *tb)
-{
-       SAFE_FREE(tb->trigger_name);
-       SAFE_FREE(tb->view_name);
-       SAFE_FREE(tb->event_table);
-       SAFE_FREE(tb->action_table);
-       SAFE_FREE(tb);
-}
-
-void __media_svc_column_free(column_info_s *col)
-{
-       SAFE_FREE(col->name);
-       SAFE_FREE(col->type);
-       SAFE_FREE(col->option);
-       SAFE_FREE(col->index_name);
-       SAFE_FREE(col);
-}
 
 void _media_svc_destroy_table_query()
 {
        int i = 0;
-       table_info_s *tb = NULL;
-       column_info_s *col_ptr = NULL;
-       int len = 0;
 
        /* Table Free */
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_MEDIA);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_MEDIA);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_FOLDER);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_FOLDER);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_PLAYLIST_MAP);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_ALBUM);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_ALBUM);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_TAG_MAP);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_BOOKMARK);
-
-       tb = g_hash_table_lookup(table, MEDIA_SVC_DB_TABLE_STORAGE);
-       __media_svc_table_free(tb);
-       g_hash_table_remove(table, MEDIA_SVC_DB_TABLE_STORAGE);
-
        g_hash_table_destroy(table);
 
        /* Column Free */
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_MEDIA]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_MEDIA], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_FOLDER]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_FOLDER], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST_MAP], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_PLAYLIST]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_PLAYLIST], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_ALBUM]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_ALBUM], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG_MAP]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG_MAP], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_TAG]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_TAG], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_BOOKMARK]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_BOOKMARK], i);
-               __media_svc_column_free(col_ptr);
-       }
-
-       len = g_slist_length(column_list[MEDIA_SVC_DB_LIST_STORAGE]);
-
-       for (i = 1; i < len; i++) {
-               col_ptr = g_slist_nth_data(column_list[MEDIA_SVC_DB_LIST_STORAGE], i);
-               __media_svc_column_free(col_ptr);
-       }
-
        for (i = 0; i < MEDIA_SVC_DB_LIST_MAX; i++)
-               g_slist_free(column_list[i]);
-
+               g_slist_free_full(column_list[i], __media_svc_column_free);
 }
 
 static int __alter_table(sqlite3 *db_handle, uid_t uid)