[easytag/wip/musicbrainz-support] Fixed memory leak due to cancel



commit 6aff54e22f25e7a7ca11839994263f342460e65c
Author: Abhinav <abhijangda hotmail com>
Date:   Fri Aug 1 22:40:41 2014 +0530

    Fixed memory leak due to cancel

 src/mb_search.c    |  175 +++++++++++++++++++++++++++++++++++++++------------
 src/mbentityview.c |    3 +-
 2 files changed, 136 insertions(+), 42 deletions(-)
---
diff --git a/src/mb_search.c b/src/mb_search.c
index 49e0ed0..706a52f 100755
--- a/src/mb_search.c
+++ b/src/mb_search.c
@@ -40,7 +40,7 @@ static int port = 0;
                                                         ET_MB5_SEARCH_ERROR_CANCELLED,\
                                                         _("Operation cancelled by user"));\
                                            g_assert (error == NULL || *error != NULL);\
-                                           return FALSE;\
+                                           goto cancel;\
                                       }
 
 /**************
@@ -200,14 +200,16 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
 {
     Mb5Query query;
     Mb5Metadata metadata;
+    Mb5Metadata metadata_entity;
     tQueryResult result;
     char *param_values[1];
     char *param_names[1];
 
-    CHECK_CANCELLED(cancellable);
-
     param_names[0] = "inc";
     query = mb5_query_new (USER_AGENT, server, port);
+    metadata = NULL;
+    metadata_entity = NULL;
+    CHECK_CANCELLED(cancellable);
 
     if (child_type == MB_ENTITY_KIND_ALBUM &&
         parent_type == MB_ENTITY_KIND_ARTIST)
@@ -246,7 +248,6 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
 
                     if (release)
                     {
-                        Mb5Metadata metadata_release;
                         gchar buf[NAME_MAX_SIZE];
                         GNode *node;
                         EtMbEntity *entity;
@@ -268,24 +269,24 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
                                                    buf,
                                                    sizeof (buf));
                         buf[size] = '\0';
-                        metadata_release = mb5_query_query (query, "release",
-                                                            buf, "",
-                                                            1, param_names,
-                                                            param_values);
+                        metadata_entity = mb5_query_query (query, "release",
+                                                           buf, "",
+                                                           1, param_names,
+                                                           param_values);
                         result = mb5_query_get_lastresult (query);
 
                         if (result == eQuery_Success)
                         {
-                            if (metadata_release)
+                            if (metadata_entity)
                             {
                                 CHECK_CANCELLED(cancellable);
                                 entity = g_slice_new (EtMbEntity);
-                                entity->entity = mb5_release_clone (mb5_metadata_get_release 
(metadata_release));
+                                entity->entity = mb5_release_clone (mb5_metadata_get_release 
(metadata_entity));
                                 entity->type = MB_ENTITY_KIND_ALBUM;
                                 entity->is_red_line = FALSE;
                                 node = g_node_new (entity);
                                 g_node_append (root, node);
-                                mb5_metadata_delete (metadata_release);
+                                mb5_metadata_delete (metadata_entity);
                             }
                         }
                         else
@@ -332,7 +333,6 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
 
                     if (medium)
                     {
-                        Mb5Metadata metadata_recording;
                         gchar buf[NAME_MAX_SIZE];
                         GNode *node;
                         EtMbEntity *entity;
@@ -355,17 +355,8 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
                         {
                             Mb5Recording recording;
 
-                            if (g_cancellable_is_cancelled (cancellable))
-                            {
-                                g_set_error (error, ET_MB5_SEARCH_ERROR,
-                                             ET_MB5_SEARCH_ERROR_CANCELLED,
-                                             _("Operation cancelled by user"));
-                                mb5_query_delete (query);
-                                mb5_metadata_delete (metadata);
-                                g_assert (error == NULL || *error != NULL);
-                                return FALSE;
-                            }
 
+                            CHECK_CANCELLED(cancellable);
                             recording = mb5_track_get_recording (mb5_track_list_item (track_list, j));
                             size = mb5_recording_get_title (recording, buf,
                                                             sizeof (buf));
@@ -382,25 +373,25 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
                                                          buf,
                                                          sizeof (buf));
                             CHECK_CANCELLED(cancellable);
-                            metadata_recording = mb5_query_query (query,
-                                                                  "recording",
-                                                                  buf, "", 1,
-                                                                  param_names,
-                                                                  param_values);
+                            metadata_entity = mb5_query_query (query,
+                                                               "recording",
+                                                               buf, "", 1,
+                                                               param_names,
+                                                               param_values);
                             result = mb5_query_get_lastresult (query);
 
                             if (result == eQuery_Success)
                             {
-                                if (metadata_recording)
+                                if (metadata_entity)
                                 {
                                     CHECK_CANCELLED(cancellable);
                                     entity = g_slice_new (EtMbEntity);
-                                    entity->entity = mb5_recording_clone (mb5_metadata_get_recording 
(metadata_recording));
+                                    entity->entity = mb5_recording_clone (mb5_metadata_get_recording 
(metadata_entity));
                                     entity->type = MB_ENTITY_KIND_TRACK;
                                     entity->is_red_line = FALSE;
                                     node = g_node_new (entity);
                                     g_node_append (root, node);
-                                    mb5_metadata_delete (metadata_recording);
+                                    mb5_metadata_delete (metadata_entity);
                                 }
                             }
                             else
@@ -423,6 +414,8 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
     else if (child_type == MB_ENTITY_KIND_ALBUM &&
              parent_type == MB_ENTITY_KIND_FREEDBID)
     {
+        mb5_query_delete (query);
+
         return et_musicbrainz_search (parent_mbid, child_type, root, error,
                                       cancellable);
     }
@@ -433,9 +426,33 @@ et_musicbrainz_search_in_entity (MbEntityKind child_type,
     return TRUE;
 
     err:
+    
+    if (metadata_entity)
+    {
+        mb5_metadata_delete (metadata_entity);
+    }
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
     et_musicbrainz_set_error_from_query (query, result, error);
     mb5_query_delete (query);
     g_assert (error == NULL || *error != NULL);
+    
+    return FALSE;
+
+    cancel:
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
+    mb5_query_delete (query);
+    g_assert (error == NULL || *error != NULL);
+
     return FALSE;
 }
 
@@ -539,8 +556,8 @@ et_musicbrainz_search_artist (gchar *string, GNode *root, GError **error,
     param_names[0] = "query";
     param_names[1] = "limit";
     param_values[1] = SEARCH_LIMIT_STR;
-    CHECK_CANCELLED(cancellable);
     query = mb5_query_new (USER_AGENT, server, port);
+    CHECK_CANCELLED(cancellable);
     param_values[0] = g_strconcat ("artist:", string, NULL);
     metadata = mb5_query_query (query, "artist", "", "", 2, param_names,
                                 param_values);
@@ -583,8 +600,8 @@ et_musicbrainz_search_artist (gchar *string, GNode *root, GError **error,
         goto err;
     }
 
-    mb5_query_delete (query);
     CHECK_CANCELLED(cancellable);
+    mb5_query_delete (query);
 
     return TRUE;
 
@@ -594,6 +611,12 @@ et_musicbrainz_search_artist (gchar *string, GNode *root, GError **error,
     g_assert (error == NULL || *error != NULL);
 
     return FALSE;
+    
+    cancel:
+    mb5_query_delete (query);
+    g_assert (error == NULL || *error != NULL);
+
+    return FALSE;
 }
 
 /*
@@ -613,18 +636,21 @@ et_musicbrainz_search_album (gchar *string, GNode *root, GError **error,
 {
     Mb5Query query;
     Mb5Metadata metadata;
+    Mb5Metadata metadata_release;
     tQueryResult result;
     char *param_values[2];
     char *param_names[2];
 
     g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
+    metadata = NULL;
+    metadata_release = NULL;
     param_names[0] = "query";
     param_names[1] = "limit";
     param_values[1] = SEARCH_LIMIT_STR;
-    CHECK_CANCELLED(cancellable);
     query = mb5_query_new (USER_AGENT, server, port);
     param_values[0] = g_strconcat ("release:", string, NULL);
+    CHECK_CANCELLED(cancellable);
     metadata = mb5_query_query (query, "release", "", "", 2, param_names,
                                 param_values);
     result = mb5_query_get_lastresult (query);
@@ -659,7 +685,6 @@ et_musicbrainz_search_album (gchar *string, GNode *root, GError **error,
 
                 if (release)
                 {
-                    Mb5Metadata metadata_release;
                     gchar buf[NAME_MAX_SIZE];
                     GNode *node;
                     EtMbEntity *entity;
@@ -715,17 +740,40 @@ et_musicbrainz_search_album (gchar *string, GNode *root, GError **error,
         goto err;
     }
 
-    mb5_query_delete (query);
     CHECK_CANCELLED(cancellable);
+    mb5_query_delete (query);
 
     return TRUE;
 
     err:
+    
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
     et_musicbrainz_set_error_from_query (query, result, error);
     mb5_query_delete (query);
     g_assert (error == NULL || *error != NULL);
 
     return FALSE;
+    
+    cancel:
+    
+    if (metadata_release)
+    {
+        mb5_metadata_delete (metadata_release);
+    }
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
+    mb5_query_delete (query);
+    g_assert (error == NULL || *error != NULL);
+
+    return FALSE;
 }
 
 /*
@@ -745,18 +793,21 @@ et_musicbrainz_search_track (gchar *string, GNode *root, GError **error,
 {
     Mb5Query query;
     Mb5Metadata metadata;
+    Mb5Metadata metadata_recording;
     tQueryResult result;
     char *param_values[2];
     char *param_names[2];
 
     g_return_val_if_fail (error == NULL || *error == NULL, FALSE);
 
+    metadata = NULL;
     param_names[0] = "query";
     param_names[1] = "limit";
     param_values[1] = SEARCH_LIMIT_STR;
-    CHECK_CANCELLED(cancellable);
+    metadata_recording = NULL;
     query = mb5_query_new (USER_AGENT, server, port);
     param_values[0] = g_strconcat ("recordings:", string, NULL);
+    CHECK_CANCELLED(cancellable);
     metadata = mb5_query_query (query, "recording", "", "", 2,
                                 param_names, param_values);
     result = mb5_query_get_lastresult (query);
@@ -785,7 +836,6 @@ et_musicbrainz_search_track (gchar *string, GNode *root, GError **error,
             for (i = 0; i < mb5_recording_list_size (list); i++)
             {
                 Mb5Recording recording;
-                Mb5Metadata metadata_recording;
                 gchar buf[NAME_MAX_SIZE];
                 GNode *node;
                 EtMbEntity *entity;
@@ -840,17 +890,40 @@ et_musicbrainz_search_track (gchar *string, GNode *root, GError **error,
         goto err;
     }
 
-    mb5_query_delete (query);
     CHECK_CANCELLED(cancellable);
+    mb5_query_delete (query);
 
     return TRUE;
 
     err:
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
     et_musicbrainz_set_error_from_query (query, result, error);
     mb5_query_delete (query);
     g_assert (error == NULL || *error != NULL);
 
     return FALSE;
+    
+    cancel:
+    
+    if (metadata_recording)
+    {
+        mb5_metadata_delete (metadata_recording);
+    }
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
+    mb5_query_delete (query);
+    g_assert (error == NULL || *error != NULL);
+
+    return FALSE;
 }
 
 /*
@@ -972,17 +1045,27 @@ et_musicbrainz_search_discid (gchar *string, GNode *root, GError **error,
         goto err;
     }
 
-    mb5_query_delete (query);
     CHECK_CANCELLED(cancellable);
+    mb5_query_delete (query);
 
     return TRUE;
-
+        
     err:
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
     et_musicbrainz_set_error_from_query (query, result, error);
     mb5_query_delete (query);
     g_assert (error == NULL || *error != NULL);
 
     return FALSE;
+    
+    cancel:
+    
+    return FALSE;
 }
 
 /*
@@ -1070,17 +1153,27 @@ et_musicbrainz_search_freedbid (gchar *string, GNode *root, GError **error,
         goto err;
     }
 
-    mb5_query_delete (query);
     CHECK_CANCELLED(cancellable);
+    mb5_query_delete (query);
 
     return TRUE;
 
     err:
+
+    if (metadata)
+    {
+        mb5_metadata_delete (metadata);
+    }
+
     et_musicbrainz_set_error_from_query (query, result, error);
     mb5_query_delete (query);
     g_assert (error == NULL || *error != NULL);
 
     return FALSE;
+    
+    cancel:
+    
+    return FALSE;
 }
 
 /*
diff --git a/src/mbentityview.c b/src/mbentityview.c
index a050b56..beafea1 100755
--- a/src/mbentityview.c
+++ b/src/mbentityview.c
@@ -636,6 +636,8 @@ search_in_levels_callback (GObject *source, GAsyncResult *res,
     GList *children;
     GList *active_child;
 
+    thread_data = user_data;
+
     if (res &&
         !g_simple_async_result_get_op_res_gboolean (G_SIMPLE_ASYNC_RESULT (res)))
     {
@@ -644,7 +646,6 @@ search_in_levels_callback (GObject *source, GAsyncResult *res,
         return;
     }
 
-    thread_data = user_data;
     entity_view = thread_data->entity_view;
     priv = ET_MB_ENTITY_VIEW_GET_PRIVATE (entity_view);
     et_music_brainz_dialog_set_statusbar_message (_("Retrieving Completed"));


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]