[evolution-ews/evolution-ews-3-12] Simplify memory management around ews_sync_mi_flags() function



commit 2d869f1c12529fbd60cf0d54e0454a26c4217833
Author: Milan Crha <mcrha redhat com>
Date:   Wed Mar 26 16:57:16 2014 +0100

    Simplify memory management around ews_sync_mi_flags() function
    
    It's quite hard to follow memory management of the calls if the called
    function sometimes frees the passed-in data and sometimes not, thus
    the actual simplification here is to make it clear whom is responsible
    for the memory free. It's always the caller now. This should also
    avoid any memory leaks in the related code in the future.

 src/camel/camel-ews-folder.c  |   47 +++++++++++++++++++---------------------
 src/server/e-ews-connection.c |   20 ++++++++--------
 src/server/e-ews-connection.h |    8 +++---
 3 files changed, 36 insertions(+), 39 deletions(-)
---
diff --git a/src/camel/camel-ews-folder.c b/src/camel/camel-ews-folder.c
index 7ed46c1..b22a7ec 100644
--- a/src/camel/camel-ews-folder.c
+++ b/src/camel/camel-ews-folder.c
@@ -94,7 +94,7 @@ struct _CamelEwsFolderPrivate {
 
 extern gint camel_application_is_exiting;
 
-static gboolean ews_delete_messages (CamelFolder *folder, GSList *deleted_items, gboolean expunge, 
GCancellable *cancellable, GError **error);
+static gboolean ews_delete_messages (CamelFolder *folder, const GSList *deleted_items, gboolean expunge, 
GCancellable *cancellable, GError **error);
 static gboolean ews_refresh_info_sync (CamelFolder *folder, GCancellable *cancellable, GError **error);
 
 #define d(x)
@@ -838,13 +838,14 @@ static void
 msg_update_flags (ESoapMessage *msg,
                   gpointer user_data)
 {
-       GSList *mi_list = user_data;
+       /* the mi_list is owned by the caller */
+       const GSList *mi_list = user_data, *iter;
        CamelEwsMessageInfo *mi;
 
-       while ((mi = g_slist_nth_data (mi_list, 0))) {
+       for (iter = mi_list; iter; iter = g_slist_next (iter)) {
                guint32 flags_changed;
 
-               mi_list = g_slist_remove (mi_list, mi);
+               mi = iter->data;
 
                flags_changed = mi->server_flags ^ mi->info.flags;
 
@@ -926,15 +927,12 @@ msg_update_flags (ESoapMessage *msg,
                mi->info.dirty = TRUE;
 
                camel_folder_summary_touch (mi->info.summary);
-
-               camel_message_info_unref (mi);
        }
-       /* Don't think we need to free the list; we already freed every element */
 }
 
 static gboolean
 ews_sync_mi_flags (CamelFolder *folder,
-                   GSList *mi_list,
+                   const GSList *mi_list,
                    GCancellable *cancellable,
                    GError **error)
 {
@@ -955,7 +953,7 @@ ews_sync_mi_flags (CamelFolder *folder,
                cnc, EWS_PRIORITY_LOW,
                "AlwaysOverwrite", "SaveOnly",
                NULL, NULL,
-               msg_update_flags, mi_list, NULL,
+               msg_update_flags, (gpointer) mi_list, NULL,
                cancellable, &local_error);
 
        if (local_error) {
@@ -970,7 +968,7 @@ ews_sync_mi_flags (CamelFolder *folder,
 
 static gboolean
 ews_save_flags (CamelFolder *folder,
-               GSList *mi_list,
+               const GSList *mi_list,
                GCancellable *cancellable,
                GError **error)
 {
@@ -1023,7 +1021,7 @@ ews_folder_is_of_type (CamelFolder *folder,
 
 static gboolean
 ews_move_to_junk_folder (CamelFolder *folder,
-                         GSList *junk_uids,
+                         const GSList *junk_uids,
                          GCancellable *cancellable,
                          GError **error)
 {
@@ -1035,7 +1033,6 @@ ews_move_to_junk_folder (CamelFolder *folder,
 
        if (ews_folder_is_of_type (folder, CAMEL_FOLDER_TYPE_JUNK)) {
                /* cannot move to itself, but treat it as success */
-               g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
                return TRUE;
        }
 
@@ -1073,7 +1070,7 @@ ews_move_to_junk_folder (CamelFolder *folder,
 
                if (status) {
                        CamelFolderChangeInfo *changes;
-                       GSList *iter;
+                       const GSList *iter;
 
                        changes = camel_folder_change_info_new ();
 
@@ -1100,8 +1097,6 @@ ews_move_to_junk_folder (CamelFolder *folder,
                        camel_ews_store_maybe_disconnect (ews_store, local_error);
                        g_propagate_error (error, local_error);
                }
-
-               g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
        }
 
        g_object_unref (cnc);
@@ -1176,6 +1171,7 @@ ews_synchronize_sync (CamelFolder *folder,
 
                if (mi_list_len == EWS_MAX_FETCH_COUNT) {
                        success = ews_save_flags (folder, mi_list, cancellable, &local_error);
+                       g_slist_free_full (mi_list, camel_message_info_unref);
                        mi_list = NULL;
                        mi_list_len = 0;
                }
@@ -1183,16 +1179,15 @@ ews_synchronize_sync (CamelFolder *folder,
 
        if (mi_list != NULL && success)
                success = ews_save_flags (folder, mi_list, cancellable, &local_error);
+       g_slist_free_full (mi_list, camel_message_info_unref);
 
        if (deleted_uids && success)
                success = ews_delete_messages (folder, deleted_uids, ews_folder_is_of_type (folder, 
CAMEL_FOLDER_TYPE_TRASH), cancellable, &local_error);
-       else
-               g_slist_free_full (deleted_uids, (GDestroyNotify) camel_pstring_free);
+       g_slist_free_full (deleted_uids, (GDestroyNotify) camel_pstring_free);
 
        if (junk_uids && success)
                success = ews_move_to_junk_folder (folder, junk_uids, cancellable, &local_error);
-       else
-               g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
+       g_slist_free_full (junk_uids, (GDestroyNotify) camel_pstring_free);
 
        camel_folder_summary_save_to_db (folder->summary, NULL);
        camel_folder_summary_free_array (uids);
@@ -1862,6 +1857,7 @@ ews_transfer_messages_to_sync (CamelFolder *source,
 
                if (mi_list_len == EWS_MAX_FETCH_COUNT) {
                        success = ews_save_flags (source, mi_list, cancellable, &local_error);
+                       g_slist_free_full (mi_list, camel_message_info_unref);
                        mi_list = NULL;
                        mi_list_len = 0;
                }
@@ -1869,6 +1865,7 @@ ews_transfer_messages_to_sync (CamelFolder *source,
 
        if (mi_list != NULL && success)
                success = ews_save_flags (source, mi_list, cancellable, &local_error);
+       g_slist_free_full (mi_list, camel_message_info_unref);
 
        ids = g_slist_reverse (ids);
 
@@ -1971,7 +1968,7 @@ ews_transfer_messages_to_sync (CamelFolder *source,
 
 static gboolean
 ews_delete_messages_from_server (CamelEwsStore *ews_store,
-                                GSList *deleted_items,
+                                const GSList *deleted_items,
                                 EwsDeleteType delete_type,
                                 GCancellable *cancellable,
                                 GError **error)
@@ -1992,15 +1989,15 @@ ews_delete_messages_from_server (CamelEwsStore *ews_store,
 
 static void
 ews_delete_messages_from_folder (CamelFolder *folder,
-                                GSList *deleted_items)
+                                const GSList *deleted_items)
 {
        CamelFolderChangeInfo *changes;
-       GSList *l;
+       const GSList *iter;
 
        changes = camel_folder_change_info_new ();
 
-       for (l = deleted_items; l != NULL; l = l->next) {
-               const gchar *uid = l->data;
+       for (iter = deleted_items; iter != NULL; iter = iter->next) {
+               const gchar *uid = iter->data;
 
                camel_folder_summary_lock (folder->summary);
                camel_folder_change_info_remove_uid (changes, uid);
@@ -2019,7 +2016,7 @@ ews_delete_messages_from_folder (CamelFolder *folder,
 
 static gboolean
 ews_delete_messages (CamelFolder *folder,
-                     GSList *deleted_items,
+                     const GSList *deleted_items,
                      gboolean expunge,
                      GCancellable *cancellable,
                      GError **error)
diff --git a/src/server/e-ews-connection.c b/src/server/e-ews-connection.c
index 3459f43..1fad03d 100644
--- a/src/server/e-ews-connection.c
+++ b/src/server/e-ews-connection.c
@@ -4423,7 +4423,7 @@ delete_item_response_cb (ESoapResponse *response,
 void
 e_ews_connection_delete_items (EEwsConnection *cnc,
                                gint pri,
-                               GSList *ids,
+                               const GSList *ids,
                                EwsDeleteType delete_type,
                                EwsSendMeetingCancellationsType send_cancels,
                                EwsAffectedTaskOccurrencesType affected_tasks,
@@ -4434,7 +4434,7 @@ e_ews_connection_delete_items (EEwsConnection *cnc,
        ESoapMessage *msg;
        GSimpleAsyncResult *simple;
        EwsAsyncData *async_data;
-       GSList *l;
+       const GSList *iter;
 
        g_return_if_fail (cnc != NULL);
 
@@ -4461,8 +4461,8 @@ e_ews_connection_delete_items (EEwsConnection *cnc,
 
        e_soap_message_start_element (msg, "ItemIds", "messages", NULL);
 
-       for (l = ids; l != NULL; l = g_slist_next (l))
-               e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id", 
l->data);
+       for (iter = ids; iter != NULL; iter = g_slist_next (iter))
+               e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id", 
iter->data);
 
        e_soap_message_end_element (msg);
 
@@ -4584,7 +4584,7 @@ e_ews_connection_delete_items_finish (EEwsConnection *cnc,
 gboolean
 e_ews_connection_delete_items_sync (EEwsConnection *cnc,
                                     gint pri,
-                                    GSList *ids,
+                                    const GSList *ids,
                                     EwsDeleteType delete_type,
                                     EwsSendMeetingCancellationsType send_cancels,
                                     EwsAffectedTaskOccurrencesType affected_tasks,
@@ -6028,7 +6028,7 @@ e_ews_connection_move_items (EEwsConnection *cnc,
                              gint pri,
                              const gchar *folder_id,
                              gboolean docopy,
-                             GSList *ids,
+                             const GSList *ids,
                              GCancellable *cancellable,
                              GAsyncReadyCallback callback,
                              gpointer user_data)
@@ -6036,7 +6036,7 @@ e_ews_connection_move_items (EEwsConnection *cnc,
        ESoapMessage *msg;
        GSimpleAsyncResult *simple;
        EwsAsyncData *async_data;
-       GSList *l;
+       const GSList *iter;
 
        g_return_if_fail (cnc != NULL);
 
@@ -6070,8 +6070,8 @@ e_ews_connection_move_items (EEwsConnection *cnc,
        e_soap_message_end_element (msg); /* ToFolderId */
 
        e_soap_message_start_element (msg, "ItemIds", "messages", NULL);
-       for (l = ids; l != NULL; l = g_slist_next (l))
-               e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id", 
l->data);
+       for (iter = ids; iter != NULL; iter = g_slist_next (iter))
+               e_ews_message_write_string_parameter_with_attribute (msg, "ItemId", NULL, NULL, "Id", 
iter->data);
        e_soap_message_end_element (msg); /* ItemIds */
 
        e_ews_message_write_footer (msg);
@@ -6137,7 +6137,7 @@ e_ews_connection_move_items_sync (EEwsConnection *cnc,
                                   gint pri,
                                   const gchar *folder_id,
                                   gboolean docopy,
-                                  GSList *ids,
+                                  const GSList *ids,
                                   GSList **items,
                                   GCancellable *cancellable,
                                   GError **error)
diff --git a/src/server/e-ews-connection.h b/src/server/e-ews-connection.h
index a998441..300c1d4 100644
--- a/src/server/e-ews-connection.h
+++ b/src/server/e-ews-connection.h
@@ -574,7 +574,7 @@ gboolean    e_ews_connection_get_items_sync (EEwsConnection *cnc,
 
 void           e_ews_connection_delete_items   (EEwsConnection *cnc,
                                                 gint pri,
-                                                GSList *ids,
+                                                const GSList *ids,
                                                 EwsDeleteType delete_type,
                                                 EwsSendMeetingCancellationsType send_cancels,
                                                 EwsAffectedTaskOccurrencesType affected_tasks,
@@ -588,7 +588,7 @@ gboolean    e_ews_connection_delete_items_finish
 gboolean       e_ews_connection_delete_items_sync
                                                (EEwsConnection *cnc,
                                                 gint pri,
-                                                GSList *ids,
+                                                const GSList *ids,
                                                 EwsDeleteType delete_type,
                                                 EwsSendMeetingCancellationsType send_cancels,
                                                 EwsAffectedTaskOccurrencesType affected_tasks,
@@ -892,7 +892,7 @@ void                e_ews_connection_move_items     (EEwsConnection *cnc,
                                                 gint pri,
                                                 const gchar *folder_id,
                                                 gboolean docopy,
-                                                GSList *ids,
+                                                const GSList *ids,
                                                 GCancellable *cancellable,
                                                 GAsyncReadyCallback callback,
                                                 gpointer user_data);
@@ -906,7 +906,7 @@ gboolean    e_ews_connection_move_items_sync
                                                 gint pri,
                                                 const gchar *folder_id,
                                                 gboolean docopy,
-                                                GSList *ids,
+                                                const GSList *ids,
                                                 GSList **items_ret,
                                                 GCancellable *cancellable,
                                                 GError **error);


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